C# 4.0 の一般的な共分散と反分散
C# 4.0 では、ジェネリック共分散と反分散のサポートが導入され、ジェネリック型の割り当てがより柔軟になります。以前のバージョンの C# では、List<string>
が文字列に変換できる任意のオブジェクトを保持できたとしても、List<object>
を List<string>
に代入しようとするとコンパイラ エラーが発生しました。
この問題を解決するために、C# 4.0 では、出力バリアント型 (IEnumerable<T>
など) の共分散と入力バリアント型 (Action<T>
など) の反分散が許可されています。
共分散
共分散により、ある型を継承階層内の別の型の置換として使用できます。たとえば、文字列はオブジェクトであるため、List<string>
を List<object>
に割り当てることができます。これは、IEnumerable<T>
が IEnumerable<out T>
として宣言されているためであり、型 T の値のみを出力できることを意味します。したがって、値を読み取るためにのみ使用される限り、List<string>
を使用しても安全です。 List<object>
インバータ
反変性により、ある型を継承階層内の別の型の置換として使用できます。たとえば、オブジェクトは引数として文字列を受け取ることができるため、 を Action<object>
に割り当てることができます。これは、Action<string>
が Action<T>
として宣言されており、型 T の値のみを受け入れることができるためです。したがって、値を渡すためにのみ使用される限り、Action<in T>
を使用しても安全です。 Action<object>
Action<string>
C# 4.0 では、分散は CLR の共分散と反分散のサポートを使用して実装されます。これにより、C# 4.0 は型の安全性を損なうことなくバリアンスをサポートできるようになります。
ジェネリック型が出力バリアントまたは入力バリアントとして宣言されている場合、コンパイラーは追加の IL コードを生成して、実行時に型パラメーターの差異をチェックします。これにより、共分散と反分散が安全な方法でのみ使用されることが保証されます。
以上がC# 4.0 の汎用共分散と反分散はどのように型割り当ての柔軟性を強化しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。