C# 4.0 の共変クラスの省略: より深く見てみる
C# 4.0 では、インターフェイスに汎用バリアンスが導入され、柔軟な型パラメーターの使用が可能になりました。 ただし、この機能はクラスには拡張されませんでした。この記事では、この設計選択の背後にある理論的根拠を詳しく説明します。
実装のハードル
クラス (たとえば、仮想の C<T>
クラス) に共変分散を導入すると、実装に重大な課題が生じます。 主な制限は、T
が出力パラメーター、セッター、またはフィールドとしてのみ使用できるという事実から生じます。
この制約は、ゲッターが欠落しているフィールドの直接的な結果です。 プロパティとは異なり、フィールドは読み取り専用アクセスを提供しません。 したがって、共変クラスは可変状態を持つことができず、実際の応用が大幅に制限されていました。
コストと利点を比較検討する
共変不変クラス (リストやスタックなど) が有利であることは間違いありませんが、それらをサポートするために必要な C# 型システムへの広範な変更は、C# 4.0 のリリース時点では正当化できるとは見なされませんでした。
不変構造における共分散の図解
次の例は、不変スタックにおける共分散を示しています。
<code class="language-csharp">sealed class Stack<out T> { private readonly T head; private readonly Stack<T> tail; }</code>
これにより、共変代入が可能になります。
<code class="language-csharp">Stack<string> strings = null; strings = strings.Push("hello"); strings = strings.Push("goodbye"); Stack<object> objects = strings; // Covariant assignment objects = objects.Push(123); //This would be an error if Stack<T> was mutable</code>
スタックは不変であるため、スタックへの整数の追加はタイプセーフのままです。 この操作はタイプ セーフティに違反しません。
以上が共変クラスが C# 4.0 でサポートされないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。