C# でリスト<派生クラス> をリスト<基本クラス> に安全に変換します
C# では、継承とジェネリック型を扱うときに、派生クラス オブジェクトのリストを基本クラス オブジェクトのリストに変換する必要がある状況に遭遇することがあります。基本クラスに、派生クラスでオーバーライドされる仮想メソッドが含まれている場合、問題が発生する可能性があります。
次の例を考えてみましょう:
<code class="language-csharp">class Animal { public virtual void Play(List<Animal> animals) { } } class Cat : Animal { public override void Play(List<Animal> animals) { // Cat 特定的实现 } } class Program { static void Main(string[] args) { Cat cat = new Cat(); cat.Play(new List<Cat>()); // 错误:参数 1 无法从“System.Collections.Generic.List<Cat>”转换为“System.Collections.Generic.List<Animal>” } }</code>
このコードをコンパイルすると、「パラメーター 1: 'System.Collections.Generic.List
この問題を解決するには、一般的な共分散の概念を理解する必要があります。汎用共分散を使用すると、派生クラスのオーバーライドでパラメーターの型を安全に拡張できます。この場合、パラメーターの型を List
C# 4 では、IEnumerable
<code class="language-csharp">public virtual void Play(IEnumerable<Animal> animals) { }</code>
次に、Cat クラスでオーバーライドします。
<code class="language-csharp">public override void Play(IEnumerable<Animal> animals) { }</code>
Play メソッドを共変的に安全にすることができます。これにより、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
以上がC# で `List` を `List` に安全にキャストするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。