我写了这个扩展方法(已编译):
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;
}
下面的代码会导致编译时错误(找不到合适的方法),为什么?
IEnumerable<IEnumerable<int>> foo = new int[2][];
var bar = foo.Flatten();
如果我按照如下方式实现扩展,编译时不会出现错误:
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;
}
编辑(2):我认为这个问题已经得到了解答,但它引发了另一个关于重载决议和类型约束的问题。我在这里发布了这个问题:为什么类型约束不是方法签名的一部分?
foo.Flatten<IEnumerable<int>, int>();
应该可以解决问题。 - dlev