First, you don’t need Flatten()
; that method already exists, and is called SelectMany()
. You can use it like this:
IEnumerable<IEnumerable<int>> foo = new [] { new[] {1, 2}, new[] {3, 4} };
var bar = foo.SelectMany(x => x); // bar is {1, 2, 3, 4}
Second, your first attempt doesn’t work because generic type inference works only based on the arguments to the method, not generic constraints associated with the method. Since there is no argument that directly uses the J
generic parameter, the type inference engine can’t guess what J
should be, and thus doesn’t think that your method is a candidate.
It’s edifying to see how SelectMany()
gets around this: it requires an additional Func<TSource, TResult>
argument. That allows the type inference engine to determine both generic types, since they are both available based solely on the arguments provided to the method.