J'ai une routineC# .NET en passant une collection d'objets InterfaceImplementingClass à une routine qui prend une collection d'objets Interface
public void SomeRoutine(List<IFormattable> list) { ... }
J'essaie alors d'appeler cette routine
List<Guid>list = new List<Guid>();
list.Add(Guid.NewGuid());
SomeRoutine(list);
Et il échoue avec une erreur de compilation. System.Guid implémente IFormattable, mais l'erreur que je reçois est
ne peut pas convertir 'System.Collections.Generic.List' à 'System.Collections.Generic.List'
NOTE : Vous obtiendrez la même erreur si vous utilisez simplement un tableau de Guids. Génériques n'est pas la cause ....
Mais! Compte tenu de cette
public void SomeRoutine2(IFormattable obj) { ... }
et ce
Guid a = Guid.NewGuid();
SomeRoutine2(a);
Il compile! Donc la question est pourquoi? Pourquoi suis-je capable de passer un objet Guid (qui implémente IFormattable) dans une routine qui accepte un objet de IFormattable, mais quand j'essaye de le développer en une collection (une liste générique, ou un tableau, ou n'importe quoi d'autre), je reçois une erreur de conversion?
J'ai eu beaucoup de temps à trouver une réponse, et j'ai pensé que ce serait le meilleur endroit où aller.
Vous vous rendez compte que la réponse marquée (covariance .NET 4.0) ne s'applique pas réellement aux listes, où-comme génériques fonctionne * maintenant *? –
Voir aussi: http://marcgravell.blogspot.com/2009/02/what-c-40-covariance-doesn-do.html –
Sauf que cela n'a pas fonctionné avec un tableau de Guids avec une routine qui cherche un tableau de IFormattable, soit ....? – emkayultra