C# 6.0 in Kürze durch Joseph Albahari und Ben Albahari (O'Reilly).Typ Covariance Laufzeitfehler
Copyright 2016 Joseph Albahari und Ben Albahari, 978-1-491-92706-9. aus historischen Gründen, Array-Typen Kovarianz unterstützen
Arrays:
Staaten, auf den Seiten 123-124, in Bezug Kovarianz geben. Diese bedeutet, dass B [] in A [] umgewandelt werden kann, wenn B-Unterklassen A (und beide sind Referenztypen).
Zum Beispiel:
Bear[] bears = new Bear[3];
Animal[] animals = bears; // OK
Der Nachteil dieser Wiederverwertbarkeit ist, dass Element Zuordnungen können zur Laufzeit fehlschlagen:
animals[0] = new Camel(); // Runtime error
Was ist der Grund für diese Fehler? Wenn Sie einer Instanz von Animal eine Instanz von Bear zuweisen, wird ein Laufzeitfehler ausgelöst. Ich verstehe nicht, warum es so sein sollte (indem ich eine solche Aufgabe zulasse, muss der Compiler die Verantwortung dafür übernehmen, dass "alles in Ordnung ist, was ein Tier tun kann." Da Bear ein Tier ist, ist dies der Fall . haupt keine Probleme
ich habe mein eigenes Szenario das oben zu testen.
public class X
{
public int Num { get; set; }
public void Method_1()
{
Console.WriteLine("X");
}
public virtual void Method_2()
{
Console.WriteLine(Num);
}
}
public class Y : X
{
public Y()
{
Num = 1000;
}
}
X[] arrayX = new X[] { new X { Num = 1000 }, new X { Num = 999 }, new X { Num = 51762 } };
Y[] arrayY = new Y[] { new Y { Num = 5 }, new Y { Num = 6 }, new Y { Num = 7 } };
X x = new X { Num = 1000 };
Y y = new Y { Num = 50 };
x = y;
arrayX = arrayY;
arrayX[2] = new Y { Num = 1 };
// will print 5,6,1 - no runtime errors faced
foreach (var e in arrayX)
Console.WriteLine(e.Num);
ich das snippet oben ahmt Beispiel ist das Buch glauben - aber mit meinem Schnipsel, es gibt keine Laufzeitfehler
Was fehlt mir? Wie soll animals[0] = new Camel();
einen Laufzeitfehler geworfen werden, wie das Buch sagt?
Während die "Tiere" -Array wie eine Reihe von Tieren aussieht, ist es eigentlich eine Reihe von Bären. Sie können kein Kamel zu einer Reihe von Bären hinzufügen (eindeutig würden die Bären das Kamel essen). Dein Beispiel hat Tier (X) und Bär (Y), aber es fehlt eine zweite Kindklasse wie Kamel. – juharr