ToArray()与...之间的区别ToArray的<int>的(); </int>的

时间:2013-06-12 01:23:32

标签: c# .net

对不起,如果我问的是愚蠢的问题,但有人可以解释下面两个电话之间的区别(ToArray)。在intellisense中,它没有将它们显示为重载方法和当然两个电话的输出都是一样的。

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 个答案:

答案 0 :(得分:6)

没有区别,它与ToArray()方法完全相同。编译器可以简单地根据表达式的语法推断出您需要ToArray<int>版本。推断Where()的返回值返回int。换句话说,它使用Where<int>()。这是从List&lt;&gt;的类型推断出来的。因此,它可以推断您需要ToArray<int>

因此类型推断链是List<int> =&gt; Where<int>() =&gt; ToArray<int>()

将列表更改为,例如List<long>,表达式仍然有效,无需修改。

答案 1 :(得分:5)

这里没有区别。在第一次调用中,编译器推断出类型int,而在第二次调用中,您已明确指定它。

可能存在类型必要的情况,因为无法推断。例如,对于两种不同类型IEnumerable<T>,您有两次实现T的自定义集合。这会损害可用性,因此最好避免使用这种结构。

答案 2 :(得分:4)

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

答案 3 :(得分:4)

他们是一回事。您正在目睹所谓的“类型推断”。在某些情况下,C#编译器可以根据传入的参数检测类型,您不必显式指定类型参数。在您的示例中,已知iIEnumerable<int>,因此.ToArray()可以推断参数int

以下是一篇很好的文章:http://joelabrahamsson.com/a-neat-little-type-inference-trick-with-c/

答案 4 :(得分:3)

没有区别。

int[] input = i.Where(j => j % 2 == 1).ToArray();

此处,只有编译器根据您调用T的可枚举类型推断ToArray()泛型参数。

input = i.Where(j => j % 2 == 1).ToArray<int>();

此处,编译器推断Where()的返回值是为了返回int

  • ToArray<T>()是Generic,因此它可以在任何IEnumerable<T>上运行。
  • ToArray()实际上只是根据源IEnumerable的ToArray<T>()重定向到T的隐式解释。
  • 如果您调用泛型方法并且不提供任何类型参数,编译器将尝试为您推断它们。