ToArray()和ToArray<int>()之间的区别。

7

如果我问的问题很愚蠢,请原谅,但是能有人解释一下以下两个调用 (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>();
5个回答

6
没有区别,这是完全相同的ToArray()方法。编译器可以从表达式的语法中推断出你想要使用ToArray<int>版本。Where()的返回值被推断为int类型,也就是说它使用了Where<int>()。这是从List<>的类型中推断出来的,因此它可以推断出你需要使用ToArray<int>。
所以类型推断链是List<int> => Where<int>() => ToArray<int>()。
将列表更改为List<long>,该表达式仍然可以正常工作,而无需修改它。

这篇文章或者这个应该被选为最佳答案。编译器如何进行类型推断的解释是理解的关键。 - mins

5

这里没有任何区别。在第一次调用中,编译器已经推断出了类型为int,而在第二次调用中,你明确指定了类型。

可能有些情况下需要指定类型,因为它不能被推断。例如,你有一个自定义集合实现了两个不同类型TIEnumerable<T>。这会影响可用性,所以最好避免这样的构造。


4

这是相同的通用方法。在第一种情况下,编译器会从您调用ToArray<T>()的枚举的通用类型参数中推断出通用类型参数。但是您也可以明确指定它。


4
它们是同一件事。您正在见证所谓的“类型推断”。在某些情况下,C#编译器可以基于传递的参数检测到类型,因此您不必显式指定类型参数。在您的示例中,已知iIEnumerable<int>,因此.ToArray()可以推断出参数int
这里有一篇很好的文章深入探讨了这个问题:http://joelabrahamsson.com/a-neat-little-type-inference-trick-with-c/

3
没有区别。
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>()方法。
  • 如果调用一个泛型方法时没有提供任何类型参数,编译器会尝试为您推断类型。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接