2

私はそれが可能だとは思わなかったでしょうが、どうにかして「間違った」タイプの 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」は無関係なスリブです (どちらも UnityEngine.Object から継承しますが、どちらからも継承しません)。上記の出力を可能にすることができるように、それらは互いに割り当てられたり、関連付けられたりすることはありません。

だから私の質問は:一体?

より詳細な質問:「間違った」タイプの配列を作成し、「正しい」タイプの要素で埋めるにはどうすればよいですか? これもやりたい!C# からの配列チェックを回避するにはどうすればよいですか? (おそらく unsafe() を使用していますか?)

私の現在の直感は、C# は(ArrayTypeMismatchException を介して) 間違った配列への書き込みを防ぐだけですが、どういうわけか魔法のように配列を埋めれば (Unity の場合、おそらく暗い C++ マジックを使用して)、それはうまくいくということです..?

(また面白い:これを行うeditors[0] = editors[0]と、前述のArrayTypeMismatchExceptionが発生します)

編集:また面白い:Array self = editors; editors = (Editor[])self;スローInvalidCastException

4

1 に答える 1

0

いくつかの魔法

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(オブジェクト)

True UnityEngine.Debug:Log(オブジェクト)

True UnityEngine.Debug:Log(オブジェクト)

于 2013-09-21T11:10:55.833 に答える