c# In der Objekt -orientierten Programmierung ist die abgeleitete Klassenvererbung sehr häufig. Bei der Verarbeitung des Satzes (z. B. einer Liste) ist es jedoch nicht möglich, dieselbe Basisklasse zu verwenden, um sie zu deklarieren, was möglicherweise verwirrend ist.
Betrachten Sie den folgenden Code:
Dieser Code führt zu Kompilierungsfehlern, wenn versucht wird,
<code class="language-csharp">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>(); // 编译错误 } }</code>
zu verwenden. Obwohl die Instanz der abgeleiteten Klasse C der Basisklassenvariable A zugeordnet werden kann, ist die Sammlung nicht gut. List<C>
List<A>
Der Grund für diese Grenze liegt in der Methode der C# Initialisierungsliste. Beim Erstellen von generiert C# die interne Datenstruktur der Liste beim Ausführen, und es wird erwartet, dass der Speichertyp ein Objekt von A ist. Da C jedoch eine Derivatklasse von A ist, hat sein Objekt zusätzliche Mitglieder und nimmt mehr Speicher als ein Objekt ein. Die Zuweisung von mit
List<A>
Um dieses Problem zu lösen und List<C>
als List<A>
zu ändern, können Sie die folgenden Methoden verwenden:
<.> 1. Ausdrücke Konvertierung: List<派生类>
List<基类>
<.> 2. Linq:
Verwenden Sie LINQ, um das Element wie folgt zu konvertieren:
<code class="language-csharp">List<A> listOfA = new List<C>().ConvertAll(x => (A)x);</code>
Diese Methoden ermöglichen eine sichere Ausrichtung der Konvertierung und Speicheradresse, um den normalen Betrieb der Liste sicherzustellen.
Das obige ist der detaillierte Inhalt vonWarum kann ich einer Liste in C#keine Liste zuweisen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!