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。
我在执行期间遇到此错误: 无法从源类型转换为目标类型
答案 0 :(得分:13)
您可以尝试以下内容:
foreach(Alpha a in list.Where(x => x is Alpha)) // Alpha is a script.
a.doSomething();
答案 1 :(得分:13)
你会以错误的方式处理多态:虽然Alpha是派生类型,但并不是MonoBehavior类型列表中的所有其他对象。因此有些人会失败foreach正在进行的隐式类型转换。 如果在您的环境中可用,可以使用“OfType()”扩展名:
foreach(Alpha a in list.OfType<Alpha>())
答案 2 :(得分:2)
使用OfType迭代指定类型的元素
答案 3 :(得分:2)
如果您希望循环仅对Alpha
类型进行操作,则需要重写如下:
foreach (var item in list)
{
if (item is Alpha)
{
((Alpha) item).doSomething();
}
}
编辑:Maarten的答案使用LINQ,它更简洁,所以我推荐一个。
答案 4 :(得分: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.
foreach
将尝试转换列表中的所有元素,因为Alpha是MonoBehavior但MonoBehavior不是Alpha,您无法正确运行它。因此,您检查当前是否为Alpha,然后检查它是否是您喜欢的。
答案 5 :(得分:0)
您的foreach
语句会尝试将其中的每个对象转换为Alpha
。如果他们有一个共同的超类,你可以使用它,否则使用Object
类。
答案 6 :(得分:0)
如果您的列表包含基本类型列表,并且您只是考虑每个元素并尝试认为它是Alpha类型而非非法尝试使用以下
foreach(Unity3d a in list) // Alpha is a script.
a.doSomething();
假设在Unity3d中定义了doSomething()