如果我问的问题很愚蠢,请原谅,但是能有人解释一下以下两个调用 (ToArray
) 的区别吗?在智能提示中没有显示它们为重载方法,当然这两个调用的输出结果相同。
List<int> i = new List<int> { 1, 2, 5, 64 };
int[] input = i.Where(j => j % 2 == 1).ToArray();
input = i.Where(j => j % 2 == 1).ToArray<int>();
这里没有任何区别。在第一次调用中,编译器已经推断出了类型为int
,而在第二次调用中,你明确指定了类型。
可能有些情况下需要指定类型,因为它不能被推断。例如,你有一个自定义集合实现了两个不同类型T
的IEnumerable<T>
。这会影响可用性,所以最好避免这样的构造。
这是相同的通用方法。在第一种情况下,编译器会从您调用ToArray<T>()
的枚举的通用类型参数中推断出通用类型参数。但是您也可以明确指定它。
i
是IEnumerable<int>
,因此.ToArray()
可以推断出参数int
。int[] input = i.Where(j => j % 2 == 1).ToArray();
在这里,只有编译器基于你调用 ToArray()
的可枚举类型来推断出 T
泛型参数。
input = i.Where(j => j % 2 == 1).ToArray<int>();
这里,编译器会推断Where()
方法的返回值类型为int
。
ToArray<T>()
是泛型方法,它可以操作任何类型的IEnumerable<T>
。ToArray()
实际上只是将T
替换为源IEnumerable
的隐式解释版本后,重定向到ToArray<T>()
方法。