Aplatir IEnumerable<IEnumerable<>>; la compréhension des génériques

J'ai écrit cette méthode d'extension (qui compile):

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é), pourquoi?:

IEnumerable<IEnumerable<int>> foo = new int[2][];
var bar = foo.Flatten();

Si j'en œuvre de l'extension comme ci-dessous, je n'obtiens 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 je considère répondu, mais il a soulevé une autre question concernant la résolution de surcharge et le type de contraintes. Cette question je l'ai mis ici: Pourquoi ne pas les contraintes de type partie de la signature de la méthode?

  • Votre montage ne fonctionne pas parce que vous avez trop entourant énumérable. foo.Flatten<IEnumerable<int>, int>(); devrait fonctionner.
InformationsquelleAutor Daryl | 2012-02-25