派生クラスのリストを基本クラスのリストに変換します
共分散とは、派生型が機能を失うことなく基本型を置き換えることができることを意味します。この場合、基本クラス (Animal) と派生クラス (Cat) があり、基本クラスには入力パラメーターとして List を受け入れる仮想メソッド Play が含まれています。
次のコードは変換の問題を示しています:
<code class="language-csharp">using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication9 { class Animal { public virtual void Play(List<Animal> animals) { } } class Cat : Animal { public override void Play(List<Animal> animals) { } } class Program { static void Main(string[] args) { Cat cat = new Cat(); cat.Play(new List<Cat>()); } } }</code>
コードをコンパイルすると、次のエラーが発生します: 引数 1: 'System.Collections.Generic.List
このエラーは、List が書き込み可能なデータ構造であるために発生します。 List
この問題を解決するために、C# 4 では、安全であることがわかっているインターフェイスに対して「汎用共分散」と呼ばれる概念を導入しました。 IEnumerable
List
<code class="language-csharp">class Animal { public virtual void Play(IEnumerable<Animal> animals) { } } class Cat : Animal { public override void Play(IEnumerable<Animal> animals) { } } class Program { static void Main() { Cat cat = new Cat(); cat.Play(new List<Cat>()); } }</code>
IEnumerable<T>
の代わりに List<T>
インターフェイスを使用することで、C# の共分散機能を利用し、型変換エラーを回避し、コードの安全性を確保します。 IEnumerable<T>
ではデータの読み取りのみが許可され、変更は許可されないため、List<Cat>
を IEnumerable<Animal>
に変換しても安全です。
以上がC# で `List` を `List` にキャストできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。