cette méthode que j'ai écrit d'extension (qui compile):Aplatir IEnumerable <IEnumerable <>>; la compréhension des génériques
public static IEnumerable<J> Flatten<T, J>(this IEnumerable<T> @this)
where T : IEnumerable<J>
{
foreach (T t in @this)
foreach (J j in t)
yield return j;
}
Le code ci-dessous provoque une erreur de compilation (pas de méthode appropriée trouvée), pourquoi?:
IEnumerable<IEnumerable<int>> foo = new int[2][];
var bar = foo.Flatten();
Si je mets en œuvre l'extension comme ci-dessous, je reçois pas d'erreur de compilation:
public static IEnumerable<J> Flatten<J>(this IEnumerable<IEnumerable<J>> @this)
{
foreach (IEnumerable<J> js in @this)
foreach (J j in js)
yield return j;
}
Edit (2): Cette question que je considère répondu, mais il a soulevé une autre question concernant résolution de surcharge et contraintes de type. Cette question que je pose ici: Why aren't type constraints part of the method signature?
Votre modification ne fonctionne pas parce que vous avez trop d'objets environnants. 'foo.Flatten, int>();' devrait fonctionner. –
dlev