簡體   English   中英

foreach in a list [C#]

[英]foreach in a list [C#]

MonoBehavior[] list; // This is from Unity3d but think of it as Object, 
                     // all classes inherit from it.

列表中包含許多內容,其中一些是Alpha,來自Alpha類,其他來自其他類。

foreach(Alpha a in list) // Alpha is a script. 
  a.doSomething();

我假設我的foreach會以這種方式工作:在列表中找到的Foreach Alpha腳本做了一些事情,忽略了所有其他組件。

我認為這是一個鑄造問題。 請幫助我更好地理解cast / polymorphism。

我在執行期間遇到此錯誤: 無法從源類型轉換為目標類型

你是以錯誤的方式處理多態:雖然Alpha是派生類型,但並不是MonoBehavior類型列表中的所有其他對象。 因此有些人會失敗foreach正在進行的隱式類型轉換。 如果在您的環境中可用,則可以使用“OfType()”擴展名:

foreach(Alpha a in list.OfType<Alpha>())

您可以嘗試以下方式:

foreach(Alpha a in list.Where(x => x is Alpha)) // Alpha is a script. 
  a.doSomething();

使用OfType僅迭代指定類型的元素

如果您希望循環僅對Alpha類型進行操作,則需要重寫如下:

foreach (var item in list)
{
  if (item is Alpha)
  {
    ((Alpha) item).doSomething();
  }
}

編輯:Maarten的答案使用LINQ,它更簡潔,所以我推薦一個。

我就是這樣做的,我確信它會在Unity3d中編譯。 OfType不統一的方式的typeof但作為taras.roshko說用is是更好的。

MonoBehavior[] list;

foreach(MonoBehavior current in list) // Search the whole list for MonoBehaviors.
    if (current  is Alpha)            // Check if current is an Alpha type.
        current.doSomething();        // current is a valid Alpha type script.

foreach將嘗試轉換列表中的所有元素,因為Alpha是MonoBehavior但MonoBehavior不是Alpha,您無法正確運行它。 所以你檢查當前是否是一個Alpha,然后你是否喜歡使用它。

你的foreach語句將嘗試將其中的每個對象轉換為Alpha 如果他們有一個共同的超類,你可以使用它,否則使用Object類。

如果您的列表包含基本類型列表,並且您只是采用每個元素並嘗試認為它是Alpha類型而不是非法嘗試使用以下

foreach(Unity3d a in list) // Alpha is a script. 
     a.doSomething();

假設doSomething()在Unity3d中是defind

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM