C# の共変インターフェイスと反変インターフェイス
C# の共変インターフェイスと反変インターフェイスにより、型とその継承階層を扱う際の柔軟性が高まります。
共変インターフェース (out T)
共変インターフェイスは、ジェネリック型パラメーターを継承階層内の上位レベルの型として扱うことができることを指定します。 interface IBibble<out T>
として宣言されたインターフェイスの場合、インターフェイス参照は T から派生した型を表すものと考えることができます。
インバーターインターフェース (T 内)
反変インターフェイスにより、ジェネリック型パラメーターを継承階層の下位レベルの型として扱うことができます。インターフェイスが interface IBibble<in T>
として定義されている場合、インターフェイス参照は T の基本型を表す型と考えることができます。
共分散の実際的な応用
共分散を使用すると、派生型のコレクションを基本型のコレクションであるかのように扱うことができます。たとえば、それぞれに名前が付いている動物のリストを考えてみましょう。すべての動物には名前があるので、安全にすべての動物の名前を取得できます。
インバータの実用化
反変性により、基本型のコレクションに派生型を追加できます。たとえば、Animals コレクションにアクセスでき、そこに魚を追加する必要がある場合、すべての魚は動物であるため、追加することができます。ただし、コレクションに魚だけが含まれているという保証はないため、コレクションから魚を取得しようとすることは許可されていません。
入力および出力の場所
C# 4.0 では、in
および out
キーワードは、インターフェイスを共変または反変として明示的にマークします。 in
は入力場所 (メソッド パラメーター、書き込み専用プロパティ) を指定し、out
は出力場所 (メソッドの戻り値、読み取り専用プロパティ、out
メソッド パラメーター) を示します。
例
次の例は、共分散と反分散を示しています。
<code class="language-csharp">interface IBibbleOut<out T> { } interface IBibbleIn<in T> { } class Program { static void Main(string[] args) { var b = GetOutDescendant(); // b只能保存Descendant对象 var d = GetInBase(); // d可以接收Base和Descendant对象 } static IBibbleOut<Descendant> GetOutDescendant() { return null; } static IBibbleIn<Base> GetInBase() { return null; } } class Base { } class Descendant : Base { }</code>
共分散と反変性がなければ、コンパイラはサンプル コードの型安全性を保証できず、エラーが発生する可能性があります。
以上が共分散と反分散は C# インターフェイスの型の安全性と柔軟性をどのように強化しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。