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,然后如果是,则可以随意使用它。
| 归档时间: |
|
| 查看次数: |
10966 次 |
| 最近记录: |