ホームページ > バックエンド開発 > C++ > C# で `List` を `List` に安全にキャストするにはどうすればよいですか?

C# で `List` を `List` に安全にキャストするにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2025-01-09 22:51:46
オリジナル
682 人が閲覧しました

How Can I Safely Cast a `List` to a `List` in C#?

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' から 'System.Collections.Generic.List' に変換できません」というエラー メッセージが表示されます。これは、Cat クラスが Play メソッドをオーバーライドしても、メソッドのパラメーターの型 (List) が同じままであるためです。

この問題を解決するには、一般的な共分散の概念を理解する必要があります。汎用共分散を使用すると、派生クラスのオーバーライドでパラメーターの型を安全に拡張できます。この場合、パラメーターの型を List から List に拡張します。

C# 4 では、IEnumerable とその共分散安全なインターフェイスを利用して、汎用共分散のサポートが導入されています。 Animal クラスで Play メソッドを次のように宣言します:

<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 をメソッドに渡し、共分散を使用してそれを IEnumerable に安全に変換できます。変更されたコードは次のようになります:

<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 を使用して基本クラスのメソッドが定義され、派生クラスが IEnumerable を使用してそれをオーバーライドするときに、List< を安全に変換できます。リスト に。

以上がC# で `List` を `List` に安全にキャストするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート