Sagen wir, wir haben diese Typen:C# Typ Generisches Kind Übergeordnetes Casting
class A {}
class B : A {}
class X<T> {}
Warum wir dies nicht tun können?
X<A> var = new X<B>();
Gibt es eine Problemumgehung?
[Bearbeiten] Ich versuchte Kovarianz zu verwenden, aber es scheiterte, weil ich eine Struktur, die in X zugreifen möchten, die vom Typ T und C# erlaubt es ist nicht Typ T in der Schnittstelle:
interface IX<out T> {
T sth {set; get;}
}
class X<T>: IX<T> {
T sth { set; get; }
}
[Edit 2] ich das auch versucht, aber es ist fehlgeschlagen:
class X<T> where T : A
{
public T sth { set; get; }
public static implicit operator X<T>(X<B> v)
{
return new X<T>
{
sth = v.sth,
};
}
}
es ist seltsam, dass C# nicht für ‚etw‘ auf das Gießen nicht gestattet.
In __ [Edit 2] __, wenn Sie sagen, 'neue X {...}', denken Sie daran, dass 'T' mit jedem konkreten Typ ersetzt werden kann, wenn Das läuft. Was ist, wenn zum Beispiel "T" vom Typ "Klasse Evil: A" ist? Dann weisen Sie 'v.sth' mit dem Typ' B' einer Eigenschaft vom Typ 'Evil' zu. Aber sie haben keine kompatiblen Typen. Die einzige "Beziehung" zwischen ihnen ("B" und "Böse") ist, dass beide von "A" abstammen. Ein 'B' ist also kein' Evil', also wäre die Zuordnung illegal. Da die Zuweisung für einige Ersetzungen für "T" unzulässig ist, ist die Zuweisung im Allgemeinen illegal. –
@JeppeStigNielsen Sie haben recht über [Edit 2] – HamedH