リスト をリスト
に変換します継承を扱う場合、派生クラス オブジェクトのリストを基本クラス オブジェクトのリストに変換する必要がある場合があります。ただし、これは適切に処理しないとエラーが発生する可能性があります。
書き込み可能なデータを使用したリスト変換でエラーが発生しました
次のコードを考えてみましょう:
<code class="language-c#">using System; using System.Collections.Generic; class Animal { public virtual void Play(List<Animal> animal) { } } class Cat : Animal { public override void Play(List<Animal> animal) { } } class Program { static void Main(string[] args) { Cat cat = new Cat(); cat.Play(new List<Cat>()); } }</code>
このコードは、リスト オブジェクト タイプの不一致によりコンパイル エラーを生成します。 Animal は独自のタイプ (Animal) のリストを必要としますが、このメソッドは Cat オブジェクトのリストを使用して呼び出されます。
エラーの理由
このエラーは、リストが書き込み可能であるために発生します。変換が許可されると、データ操作の問題が発生する可能性があります。たとえば、犬のオブジェクトを猫のリストに追加すると、タイプ セーフティに違反します。
一般共分散
C# 4 では、汎用共分散と呼ばれる機能が導入されました。これにより、これらの型が型安全性を保証する場合、派生クラスのリストを基本クラスのリストに変換できます。一般的な共分散の安全な型の例は IEnumerable<T>
です。これはオブジェクトのシーケンスを表しますが、書き込むことはできません。
一般的な共分散の実装
一般的な共分散を実装するには、次のように、パラメータの型として IEnumerable<T>
を使用するように基本クラスのメソッド シグネチャを変更できます。
<code class="language-c#">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>
をパラメーターとして受け取り、Animal オブジェクトと Cat オブジェクトのシーケンスを受け入れることができます。 IEnumerable<Animal>
以上がC# でリストをリストに安全にキャストするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。