c#共分散と値タイプの制限
C#の共分散により、派生インターフェイスタイプをベースインターフェイスタイプに割り当てることができます。 これにより、派生型のオブジェクトをベースタイプのオブジェクトとして扱うことができます。 ただし、この機能は、値の種類に対して意図的に制限されています ボクシングとアイデンティティの役割この制限の中心的な理由は、ボクシングプロセスです。 値タイプがインターフェイス変数に割り当てられている場合、それはボックス化され、ヒープの参照タイプに変換されます。これにより、元の値のアイデンティティが変更され、新しい
オブジェクトが作成されます。 すでに山の上に住んでいる参照タイプは、このアイデンティティを変えるボクシングを受けないでください。アイデンティティを維持することは、共分散にとって重要です。 価値タイプに対して共分散が許可されている場合、ベースタイプコレクション内の派生型オブジェクトを変更すると、予期しない動作とアイデンティティの矛盾につながる可能性があります。 例示的な例
次のコードスニペットは問題を示しています:
(仮説的な)共分散が原因で最初の割り当てが機能しますが、
を変更することは、でボックス化された値を予期せずに変化させ、C#の価値タイプの共分散サポートを防ぐIDの問題を強調します。 2番目の
は、変更後の<code class="language-csharp">IEnumerable<int> intList = new List<int>(); IEnumerable<object> objList = intList; // Covariance (if allowed for value types) intList.Add(10); Console.WriteLine(((List<int>)objList)[0]); // Output: 10 intList[0] = 20; Console.WriteLine(((List<int>)objList)[0]); // Output: 0 (Unexpected!)</code>
inintList
に直接リンクされていないため、0の予期しない出力を示します。 objList
は、変更されていないままであるConsole.WriteLine
オリジナルint
箱入りobjList
への参照を保持しています。
以上が共分散がC#で価値の種類をサポートしないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。