[英]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.