クラス内の汎用分散に対する C# 4.0 の制限
インターフェイスとは異なり、C# 4.0 ではクラスの一般的な差異は許可されません。 この制限により、なぜ制限があるのかという疑問が生じます。クラスの汎用バリアンスを有効にすることの潜在的な欠点は何ですか?
共変クラスによるチャレンジ
共変クラス C<T>
を想像してください。 共分散を実装するには、T
が厳密に出力タイプである必要があります。これは、クラスが入力として T
を取るメソッドやプロパティを持つことができないことを意味します。 同様に、タイプ T
のフィールドは、基本的にプロパティ セッターのように機能するため、許可されません。
限定的な適用性: 不変構造
共変クラスの唯一の現実的な適用は、リストやスタックのような不変構造です。不変クラスには利点がありますが、この限られた使用例では、不変クラス型の共分散をネイティブにサポートすることによるかなりのオーバーヘッドが正当化されません。
説明例: 潜在的な利点
共変 Stack<T>
では、理論的には次のようなコードが可能になります。
<code class="language-csharp">Stack<string> strings = null; strings = strings.Push("hello"); strings = strings.Push("goodbye"); Stack<object> objects = strings; objects = objects.Push(123);</code>
ここでは、不変構造が型安全性を損なう操作を防ぐため、文字列スタックに整数を追加すると型安全になります。
概要
クラスの汎用分散にはいくつかの利点があるかもしれませんが、メソッドまたはプロパティの入力としてクラス型パラメーターを使用できないという制約が利点を上回ります。これは、C# 4.0 以降のバージョンにこの機能が存在しないことを説明しています。
以上がC# 4.0 がクラスの Generic Variance をサポートしないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。