私はそれが可能だとは思わなかったでしょうが、どうにかして「間違った」タイプの 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