ホームページ > バックエンド開発 > C++ > 共分散がC#で価値の種類をサポートしないのはなぜですか?

共分散がC#で価値の種類をサポートしないのはなぜですか?

Barbara Streisand
リリース: 2025-01-30 21:26:13
オリジナル
709 人が閲覧しました

Why Doesn't Covariance Support Value Types in C#?

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>
ログイン後にコピー
in

inintListに直接リンクされていないため、0の予期しない出力を示します。 objListは、変更されていないままであるConsole.WriteLineオリジナルint箱入りobjListへの参照を保持しています。

以上が共分散がC#で価値の種類をサポートしないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート