ホームページ > バックエンド開発 > C++ > 共変クラスが C# 4.0 でサポートされないのはなぜですか?

共変クラスが C# 4.0 でサポートされないのはなぜですか?

Linda Hamilton
リリース: 2025-01-12 21:52:43
オリジナル
893 人が閲覧しました

Why Aren't Covariant Classes Supported in C# 4.0?

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 サイトの他の関連記事を参照してください。

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