foreach在列表中的用法[c#]

本文关键字:用法 列表 foreach | 更新日期: 2023-09-27 18:03:59

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脚本在列表中找到做某事,忽略所有其他组件。

我想这是选角的问题。请帮助我更好地理解类型转换/多态性。

我在执行过程中得到这个错误:不能从源类型强制转换为目标类型

foreach在列表中的用法[c#]

您正在以错误的方式处理多态性:虽然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();

这就是我要做的,我知道它肯定会在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.

foreach将尝试转换列表中的所有元素,因为Alpha是MonoBehavior,但MonoBehavior不是Alpha,您无法正确运行它。检查current是否为Alpha,如果是,可以随意使用

使用OfType只遍历指定类型的元素

如果您希望循环只操作Alpha类型,则需要重写如下:

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

编辑:Maarten的回答使用了更简洁的LINQ,所以我推荐使用LINQ。

您的foreach语句将尝试将那里的每个对象转换为Alpha。如果它们有一个共同的父类,你可以使用它,否则使用Object

如果你的list包含基本类型的list并且你只是取每个元素并试图认为它是Alpha类型那么尝试使用below

是非法的
foreach(Unity3d a in list) // Alpha is a script. 
     a.doSomething();

假设在Unity3d中定义了doSomething()