如果我问的是愚蠢的问题,请原谅,但是任何人都可以解释以下两个调用(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>();
没有区别,它是完全相同的 ToArray() 方法。ToArray<int>
编译器可以简单地从表达式的语法中推断出您想要的版本。Where() 的返回值被推断为返回 int。换句话说,它使用Where<int>()
. 这是从 List<> 的类型推断出来的。所以它可以推断出你需要ToArray<int>
.
所以类型推断链是List<int>
=> Where<int>()
=> ToArray<int>()
。
例如,将列表更改为,List<long>
表达式仍然有效,而无需修改它。
这里没有区别。在第一次调用中,编译器推断了类型int
,而在第二次调用中,您明确指定了它。
在某些情况下,类型是必需的,因为它无法推断。例如,您有一个IEnumerable<T>
针对两种不同类型实现两次的自定义集合T
。这会损害可用性,因此最好避免这种结构。
这是相同的通用方法。在第一种情况下,泛型类型参数由编译器从您正在调用的枚举的泛型类型参数中推断出来ToArray<T>()
。但您也可以明确指定它。
他们是一样的东西。您正在见证所谓的“类型推断”。在某些情况下,C# 编译器可以根据传入的参数检测类型,而您不必显式指定类型参数。在您的示例中,已知i
是 a IEnumerable<int>
,因此.ToArray()
可以推断参数int
。
这是一篇很好的文章,深入探讨了这一点:http: //joelabrahamsson.com/a-neat-little-type-inference-trick-with-c /
没有不同。
int[] input = i.Where(j => j % 2 == 1).ToArray();
在这里,只有编译器会T
根据您调用的枚举类型推断通用参数ToArray()
。
input = i.Where(j => j % 2 == 1).ToArray<int>();
在这里,Where()
编译器将返回值推断为 return int
。
ToArray<T>()
是通用的,因此它可以在任何IEnumerable<T>
.ToArray()
实际上只是重定向到ToArray<T>()
基于T
源 IEnumerable 的隐式解释。