C# での派生クラスのリストを基本クラスのリストに変換する
この例は、基本クラス オブジェクト (List<Cat>
) のリストを期待するメソッドに派生クラス オブジェクトのリスト (例: List<Animal>
) を渡すという一般的な問題を示しています。 基本クラス参照は派生クラス オブジェクトを直接指すことができないため、直接代入は許可されません。
問題:
List<Cat>
パラメータを持つメソッドに List<Animal>
を渡そうとすると、コンパイラ エラーが発生します。
解決策: IEnumerable
と共分散の使用
このソリューションは C# の一般的な共分散を利用します。 List<Animal>
を使用する代わりに、メソッドのパラメーターの型を IEnumerable<Animal>
に変更します。 IEnumerable
は読み取り専用インターフェイスです。これにより、メソッドによる元のコレクションの変更が防止され、潜在的な型安全性の問題に対処できます。
改訂コード:
<code class="language-csharp">class Animal { public virtual void Play(IEnumerable<Animal> animals) { } } class Cat : Animal { public override void Play(IEnumerable<Animal> animals) { //Implementation } } class Program { static void Main() { Cat myCat = new Cat(); myCat.Play(new List<Cat>()); // This now compiles successfully } }</code>
これが機能するのは、List<Cat>
が暗黙的に IEnumerable<Cat>
に変換され、IEnumerable<Cat>
が IEnumerable<Animal>
と共変であるためです。 Play
メソッドは、コレクションを変更せずに安全にコレクションを反復処理できるようになりました。 このアプローチでは、型の安全性を維持しながら、柔軟なメソッドのパラメーター化を可能にします。
以上がC# でリストをリストにキャストするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。