Betrachten Sie eine Liste von Label
:
Collection labels = new Collection();
Jetzt möchte ich dies in eine Sammlung von Controls
umwandeln:
public void ScaleControls(ICollection controls) {}
Ich würde versuchen zu rufen:
ScaleControls(labels);
aber das lässt sich nicht kompilieren.
ScaleControls((ICollection)labels);
kompiliert, aber stürzt zur Laufzeit ab.
ICollection controls = (ICollection)labels;
ScaleControls(c);
kompiliert, aber stürzt zur Laufzeit ab.
Gibt es eine Möglichkeit, generische Listen von Objekten zu übergeben?
Die Alternative besteht darin, generische Listen zu verwerfen und typisierte Listen zu verwenden:
public class ControlList : Collection
{
}
public void InvalidateControls(ControlList controls)
{
}
Aber das bedeutet, dass der gesamte Code, der Generika verwendet, nachgerüstet werden muss.
0 Stimmen
Welche Version von .Net verwenden Sie?
0 Stimmen
Muss die Sammlung ursprünglich vom Typ Label sein oder könnte man auch mit Control davonkommen, da Label von Control erbt?
3 Stimmen
Du solltest dich mit Kovarianz und Kontravarianz beschäftigen, das könnte dein Problem lösen. Leider verwenden nur wenige der eingebauten Kollektionen dies.
0 Stimmen
@JoachimIsaksson Ich habe eine vage Vorstellung davon, was sie sind; aber nur im Zusammenhang mit "Was Sie tun möchten, wird im CLR noch nicht unterstützt, weil von...Kovarianz und Kontravarianz." Bedeutet 'mein Problem lösen', dass ich erkennen werde, dass ich nicht tun kann, was ich möchte - also kein Problem. Oder gibt es einen Weg, das Problem zu lösen, wenn ich mehr über Kovarianz und Kontravarianz lese.
0 Stimmen
@w0lf .NET-Framework 3.5
0 Stimmen
Leider werden Kovarianz und Kontravarianz erst ab .NET 4.0 unterstützt, daher denke ich, dass Sie sich mit einer der weniger eleganten Lösungen zufrieden geben müssen.
2 Stimmen
@Ian Ich denke, dass ein Teil des Materials, das es zu Kovarianz und Kontravarianz gibt, erklärt, warum man aus der Perspektive der Typensicherheit nicht tun sollte, was du verlangst. Der Kernpunkt ist, dass wenn du tun dürftest, was du verlangst, könntest du potenziell Code schreiben, um ein TextBox-Steuerelement zu einer List-Sammlung hinzuzufügen, was völlig ungültig ist.
0 Stimmen
In formalen Begriffen haben wir, weil
Label
<Control
ist, dassCollection
<ICollection
ist, und das Übergeben eines allgemeineren Typs an eine Funktion, die den spezifischeren Typ erwartet, ist nicht typsicher.0 Stimmen
Mögliche Duplikat von Casting einer generischen Sammlung zu Basistyp, Übergabe einer generischen Sammlung von Objekten an eine Methode, die eine Sammlung des Basistyps erfordert