ホームページ >バックエンド開発 >C++ >C# で `List` を `List` に直接キャストできないのはなぜですか?

C# で `List` を `List` に直接キャストできないのはなぜですか?

DDD
DDDオリジナル
2025-01-17 01:01:12326ブラウズ

Why Can't I Directly Cast a `List` to a `List` in C#?

キャスト リスト List

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

public interface IDic
{
    int Id { get; set; }
    string Name { get; set; }
}
public class Client : IDic
{

}

List<Client> clients = new List<Client>();

多くのプログラマは、この List をキャストできると想定しているかもしれません。 to a List:

List<IDic> dics = (List<IDic>)clients;

ただし、これは有効なキャストではありません。このタイプのキャストは型安全に違反するため許可されません。このキャストを試行すると、次のエラーが発生します:

Cannot convert type 'System.Collections.Generic.List<Client>' to 'System.Collections.Generic.List<IDic>'

Why is this Cast Not allowed?

このキャストが許可されない理由は、危険な行動の可能性。たとえば、次のシナリオを想像してください。

public interface IFruit {}

public class Apple : IFruit {}
public class Banana : IFruit {}

...

List<Apple> apples = new List<Apple>();
List<IFruit> fruit = (List<IFruit>)apples; // Assumed cast
fruit.Add(new Banana());

// Eek - it's a banana!
Apple apple = apples[0];

この例では、List List にキャストされます。これにより、バナナ オブジェクトをフルーツ リストに追加できるようになります。ただし、apples リストの最初の要素にアクセスすると、それは依然として Apple として扱われます。これにより、予期しない動作や潜在的なバグが発生する可能性があります。

安全な変換オプション

List を直接キャストすることはできません。 List に変換するには、これらの型間で安全に変換する方法があります。

  • ToList(): .NET 4.0 以降では、 ToList() メソッドを使用して List を変換します。新しい List に。このメソッドは、同じ要素を持つ新しいリストを作成しますが、指定されたインターフェイス タイプを使用します。
List<IFruit> fruit = apples.ToList<IFruit>();
  • Cast().ToList(): .NET 3.5 では、Cast() メソッドを使用して、 IEnumerable List から。次に、ToList() を使用して新しい List を作成できます。 IEnumerable から。
List<IFruit> fruit = apples.Cast<IFruit>().ToList();

これらの変換により新しいリストが作成されることに注意することが重要です。一方のリストに加えた変更は、もう一方のリストには反映されません。ただし、リスト内のオブジェクトに加えられた変更は両方のリストに表示されます。

以上がC# で `List` を `List` に直接キャストできないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。