c#generic medium-価値のあるタイプの不満足タイプ
ジェネリックの分散により、タイプはパラメーターのコラボレーションまたは反転を継承することができます。ただし、これらのメカニズムは値タイプには適用されません。この制限を理解するには、梱包の概念とタイプセキュリティへの影響を研究する必要があります。
宣言は変更です。調整により、導出されたタイプは、
やなどのベースタイプを置き換えることができます。ただし、値の種類はそうではありません。次のコードを検討してください:
IEnumerable<T>
IEnumerable<string>
このコードは、値タイプが不変と見なされるため、コンパイルエラーを引き起こす可能性があります。分散は、参照タイプにのみ適しています。その理由は、ボックスの複雑さです。 IEnumerable<object>
<code class="language-csharp">IEnumerable<int> intList = new List<int>(); IEnumerable<object> objList = intList;</code>変数に保存されると、ボックスはランタイム時に実行され、パッケージングデバイスは
の周りに作成されます。これにより、場合によっては値タイプを参照タイプと見なすことができます。
しかし、共同および逆の観点から、ボクシングは深刻なタイプのセキュリティ問題をもたらします。値タイプが許可されている場合、派生タイプには、そのベースタイプとは異なるデータが含まれる場合があります。これにより、偶発的な動作と潜在的なデータ損傷を引き起こす可能性があります。 int
たとえば、object
は、形式を示す異なるint
を持つオブジェクトを含める場合があります。これらのオブジェクトが訪問される場合、ランタイム時に元のobject
値に排出する必要があります。フォームが一貫していない場合、ボックスのキャンセルにより、値タイプのエラーまたはデータダメージが発生する場合があります。
タイプセキュリティを維持するために、CLRは分散を参照タイプに制限します。これにより、フォームが一貫していることが保証され、異なるタイプ間の変換はデータの整合性を引き起こさないようにします。
以上がC#ジェネリックで値タイプが不変なのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。