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

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

Susan Sarandon
リリース: 2025-01-09 22:36:42
オリジナル
283 人が閲覧しました

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

C# の

リスト をリスト

に変換します

継承を扱う場合、派生クラス オブジェクトのリストを基本クラス オブジェクトのリストに変換する必要がある場合があります。ただし、これは適切に処理しないとエラーが発生する可能性があります。

書き込み可能なデータを使用したリスト変換でエラーが発生しました

次のコードを考えてみましょう:

<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 の Play メソッドは

をパラメーターとして受け取り、Animal オブジェクトと Cat オブジェクトのシーケンスを受け入れることができます。 IEnumerable<Animal>

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

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