これはC#の特に混乱する機能です。ここでは取引があります。
ここでは、配列の要素型が値型ではなく参照型であると仮定します。
C#サポート安全でない配列の共分散。それはあなたが、文字列の配列を持っている場合は、文字列をオブジェクトに変換することができますので、あなたは、オブジェクトの配列に変換することができることを意味:あなたはその後、A2のうちの要素を取得しようとした場合
string[] a1 = { "hello", "goodbye" };
object[] a2 = a1; // Legal
、それは動作します:a2[0]
オブジェクトに変換可能な文字列であり、これは、本当にa1[0]
であるため、法的です
object o3 = a2[0];
を。あなたは、あなたが実行時時にエラーを得るでしょうアレイへ書き込みしようとすると
はしかし、:
a2[0] = new object();
a2
が本当に文字列の配列あるので、これは、実行時に失敗しました非文字列を文字列の配列に入れることはできません。
だから、C#はすでにひどく壊れています。実際にはオブジェクトの配列ではないオブジェクトの配列にオブジェクトを配置しようとしたため、コンパイルして正常に見えるが、実行時に型の例外で突然クラッシュするプログラムを記述することは可能です。
あなたが望む機能は、よりもさらに壊れていて、より壊れていて、ありがとうC#はサポートしていません。あなたが欲しい機能がある:危険な配列contravarianceだろう
object[] a4 = { "Hello" };
string[] a5 = a4;
。それはこのように恐ろしく破る:
a4[0] = new Customer(); // Perfectly legal
string s6 = a5[0];
そして今、我々はちょうどタイプ文字列の変数にカスタマーをコピーしました。
どのような種類の配列の共分散または反分散を避ける必要があります。あなたが発見したように、配列の反動は法的ではなく、配列の共分散は予期せずに消えてしまうあなたのプログラムにはほとんど時間の爆弾を作りません。 正しいタイプの配列を最初に作成します。
どのように配列をキャストしていますか?全体として?配列のすべての要素を個別にキャストする必要があります。 – Msonic
はい、彼は明らかにそれを全体としてキャスティングしています。 –
参照配列の分散は逆です。 **実際には 'string []'を 'object []'としてキャストできますが、それは実際に 'string []'でなければなりません。 –