Non, ça va convertir
List<Field> en
List<IField>... dans ton code tu as écrit
.ToList<Field>() au lieu de
.ToList<IField>()
Par exemple,
IEnumerable<T> est covariant en T, c'est à dire que si Y hérite de X, alors un
IEnumerable<Y> peut être affecté à un
IEnumerable<X>.
Exemple avec X = object et Y = string :
1 2
| List<string> listOfStrings = new List<string>(); // List<T> implémente IEnumerable<T>
IEnumerable<object> objects = listOfStrings; |
(une séquence de strings peut être considérée comme une séquence d'objects)
La contravariance, c'est le contraire. Par exemple,
Action<T> est contravariant en T, c'est à dire que si Y hérite de X, alors un
Action<X> peut être affecté à un
Action<Y> :
1 2 3
| Action<object> actionOnObject = o => Console.WriteLine(o.ToString());
Action<string> actionOnString = actionOnObject;
actionOnString("Hello"); |
(une action qui s'applique à n'importe quel object peut être appliquée à une string, puisqu'une string est un object)
Pour plus de détails, regarde
cet article
Partager