C# 6.0 en bref par Joseph Albahari et Ben Albahari (O'Reilly).Type Erreurs d'exécution de covariance
Copyright 2016 Joseph Albahari et Ben Albahari, 978-1-491-92706-9.
états, aux pages 123-124, en ce qui concerne de type covariance:
tableaux, pour des raisons historiques, prennent en charge les types de tableaux covariance. Ce signifie que B [] peut être converti en A [] si B sous-classe A (et les deux sont types de référence).
Par exemple:
Bear[] bears = new Bear[3];
Animal[] animals = bears; // OK
L'inconvénient de cette réutilisabilité est que les affectations des éléments peuvent échouer lors de l'exécution:
animals[0] = new Camel(); // Runtime error
Quelle est la raison derrière une telle erreur? Si vous affectez une instance de Bear à une instance d'Animal, une erreur d'exécution sera générée? Je ne vois pas pourquoi il devrait le faire (en autorisant une telle tâche, le compilateur doit prendre la responsabilité de dire «D'accord, je vais vous laisser faire avec cet objet tout ce qu'un animal peut faire.» Puisque Bear est un animal, . aucun problème
J'ai créé mon propre scénario pour tester ce qui précède:
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);
Je crois que l'extrait ci-dessus imite l'exemple du livre - mais avec mon extrait, il
aucune erreur d'exécution sont. Comment est-ce que animals[0] = new Camel();
est censé avoir généré une erreur d'exécution, comme l'indique le livre?
Alors que le tableau 'animals' ressemble à un tableau d'animaux, c'est en fait un tableau d'ours. Vous ne pouvez pas ajouter un chameau à une rangée d'ours (clairement les ours mangeraient le chameau). Votre exemple a l'animal (X) et l'ours (Y), mais il manque une deuxième classe d'enfant comme le chameau. – juharr