我不会认为这是可能的,但似乎您可以以某种方式创建和填充“错误”类型的 C# 数组。
我今天在 Unity 4.2.1 中偶然发现了以下异常:
Editor[] editors = ActiveEditorTracker.sharedTracker.activeEditors;
Debug.Log(editors.GetType().Name);
Debug.Log(editors.GetType().GetElementType().Name);
Debug.Log(typeof(Editor).IsAssignableFrom(editors[0].GetType()));
Debug.Log(typeof(Editor).IsAssignableFrom(editors.GetType().GetElementType()));
它打印以下输出:
MonoBehaviour[]
MonoBehaviour
True
False
在 Unity 中,“MonoBehaviour”和“Editor”类是不相关的 slibbings(都继承自 UnityEngine.Object,但都不是继承自另一个)。它们不能相互分配或以任何我能看到的方式相关,这将使上述输出成为可能。
所以我的问题是:见鬼?
更详细的问题:如何创建一个“错误”类型的数组并用“正确”类型的元素填充它?我也想做这个!如何规避 C# 中的数组检查?(也许使用 unsafe()?)
我目前的直觉是,C# 只能防止写入错误的数组(通过 ArrayTypeMismatchException),但如果你以某种方式神奇地填充数组(在 Unity 的情况下,可能使用暗 C++ 魔法),它就可以工作..?
(也很有趣:如果我这样做,editors[0] = editors[0]
我会得到提到的 ArrayTypeMismatchException)
编辑:也很有趣:Array self = editors; editors = (Editor[])self;
抛出一个InvalidCastException