Difference between ToArray() & ToArray<int>();
本文关键字:ToArray int gt lt amp Difference between | 更新日期: 2023-09-27 18:18:01
如果我问了一个愚蠢的问题,请原谅,但是有人能解释以下两个呼叫(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
是IEnumerable<int>
,因此.ToArray()
可以推断出参数int
。
这里有一篇很好的文章深入介绍了这一点:http://joelabrahamsson.com/a-neat-little-type-inference-trick-with-c/
无差异。
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()
实际上只是基于源IEnumerable的T
重定向到ToArray<T>()
的隐式解释。 - 如果你调用一个泛型方法而不提供任何类型参数,编译器会尝试为你推断它们。