このコードは、
interface A { } class B : A { } class C : B { } class Test { static void Main(string[] args) { A a = new C(); // 正确 List<A> listOfA = new List<C>(); // 编译错误 } }
この制限の理由は、C#初期化リストの方法にあります。 を作成するとき、C#は実行時にリストの内部データ構造を生成し、ストレージタイプはAのオブジェクトであると予想されます。ただし、CはAの微分クラスであるため、そのオブジェクトには追加のメンバーがあり、オブジェクトよりも多くのメモリを占有します。したがって、に割り当てると、メモリアドレスが脱臼し、メモリエラーが発生する可能性があります。 List<C>
この問題を解決して変更するために、List<A>
として
1。変換の表現:List<A>
List<C>
List<A>
リストを通過し、各要素を基本クラスに明示的に変換する:
List<派生类>
2。linq:List<基类>
linqを使用して、次のように要素を変換します。 これらのメソッドは、安全な変換とメモリアドレスのアライメントを可能にして、リストの通常の操作を確保します。
以上がC#のリストにリストを割り当てることができないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。