C# 数组类型可能错误

本文关键字:错误 类型 数组 | 更新日期: 2023-09-27 18:32:17

我不会认为这是可能的,但似乎您可以以某种方式创建和填充"错误"类型的 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 中,类 "MonoBehavior" 和 "Editor" 是不相关的 slibbing(两者都继承自 UnityEngine.Object,但都不是从另一个继承的)。它们不能相互分配或以任何方式相关,我可以看到这将使上述输出成为可能。

所以我的问题是:到底是什么?

更详细的问题:如何创建一个"错误"类型的数组并用"正确"类型的元素填充它?我也想这样做!如何规避 C# 中的数组检查?(也许使用不安全()?

我目前的直觉是,C#只能防止写入错误的数组(通过ArrayTypeMismatchException),但是如果你以某种方式神奇地填充数组(在Unity的情况下,可能使用黑暗C++魔法),它就可以工作..?

(有趣的是:如果我这样做editors[0] = editors[0]我会得到提到的ArrayTypeMismatchException)

编辑:也很有趣:Array self = editors; editors = (Editor[])self;抛出了一个InvalidCastException

C# 数组类型可能错误

一些魔法

Editor[] editors =  ActiveEditorTracker.sharedTracker.activeEditors;
    Editor e0 = editors[0];
    Editor e1 = editors[1];
    Editor e2 = editors[2];
    Editor[] test = {e0, e1, e2};
    Debug.Log(test.GetType());
    Debug.Log(typeof(Editor).IsAssignableFrom(test[0].GetType()));
    Debug.Log(typeof(Editor).IsAssignableFrom(test.GetType().GetElementType()));

UnityEditor.Editor[]UnityEngine.Debug:Log(Object)

真UnityEngine.Debug:Log(Object)

真UnityEngine.Debug:Log(Object)