J'ai la classe de classe et l'extension suivante (pour cet exemple):Conversion de IEnumerable <T> pour Méthode d'extension Problème
public class Person<T>
{
public T Value { get; set; }
}
public static class PersonExt
{
public static void Process<TResult>(this Person<IEnumerable<TResult>> p)
{
// Do something with .Any().
Console.WriteLine(p.Value.Any());
}
}
Je me attendais que je pouvais écrire quelque chose comme ce qui suit et cela fonctionnerait, mais il doesn « t:
var x = new Person<List<String>>();
x.Process();
Depuis la liste est plus faible dans l'arbre d'héritage que IEnumerable, ne devrait pas être valide ce? Cela fonctionne si je suis un Person<IEnumerable<String>>
bien sûr parce que c'est le type direct. J'essaie d'utiliser une méthode d'extension qui peut être appliquée à tous les Person<T>
tant que T implémente IEnumerable<Something>
parce que j'ai besoin d'utiliser la méthode .Any()
.
EDIT: Peut-être que ma compréhension de la covariance est désactivée? Je sais IEnumerable<String>
devrait convertir en IEnumerable<Object>
, mais ne pouvait pas IList<String>
convertir en IEnumerable<String>
?
EDIT2: J'ai oublié de mentionner que je suis en utilisant .net 4.0.
En ce qui concerne votre édition, ce sont des concepts différents, 'IList' implémente 'ICollection ' qui implémente 'IEnumerable ', c'est la raison pour laquelle la conversion, il est permis, il est pas nécessaire pour qu'il soit covariant ou contravariant dans ce Cas. –
Oui, je comprends * maintenant * à propos de co/contravariance après avoir lu quelques dernières minutes. Alors, pourquoi ce que j'ai écrit n'est pas valide? Il semble intuitif que ce serait ... – TheCloudlessSky
Si vous faisiez cela en C# 4.0, je supposerais que ça marcherait, mais pas avec C# 3.0 et moins. –