foreach in a list [C#]

Mik*_*ohn 6 c# polymorphism foreach casting

MonoBehavior[] list; // This is from Unity3d but think of it as Object, 
                     // all classes inherit from it.
Run Code Online (Sandbox Code Playgroud)

列表中包含许多内容,其中一些是Alpha,来自Alpha类,其他来自其他类.

foreach(Alpha a in list) // Alpha is a script. 
  a.doSomething();
Run Code Online (Sandbox Code Playgroud)

我假设我的foreach会以这种方式工作:在列表中找到的Foreach Alpha脚本做了一些事情,忽略了所有其他组件.

我认为这是一个铸造问题.请帮助我更好地理解cast/polymorphism.

我在执行期间遇到此错误: 无法从源类型转换为目标类型

小智 14

你是以错误的方式处理多态:虽然Alpha是派生类型,但并不是MonoBehavior类型列表中的所有其他对象.因此有些人会失败foreach正在进行的隐式类型转换.如果在您的环境中可用,则可以使用"OfType()"扩展名:

foreach(Alpha a in list.OfType<Alpha>())
Run Code Online (Sandbox Code Playgroud)


Maa*_*ten 13

您可以尝试以下方式:

foreach(Alpha a in list.Where(x => x is Alpha)) // Alpha is a script. 
  a.doSomething();
Run Code Online (Sandbox Code Playgroud)


小智 2

我就是这样做的,并且我确信它可以在 Unity3d 中编译。顺便说一句,OfType 不在 Unity 中,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.
Run Code Online (Sandbox Code Playgroud)

它将foreach尝试转换列表中的所有元素,并且由于 Alpha 是 MonoBehavior 但 MonoBehavior 不是 Alpha,因此您无法正确运行它。因此,您检查当前是否是 Alpha,然后如果是,则可以随意使用它。