2013-06-12 95 views
6

对不起,如果我提出的问题很愚蠢,但任何人都可以解释以下两个电话之间的区别(ToArray)。在intellisense中,它不会将它们显示为过载方法,当然这两个调用的输出是相同的。ToArray()和ToArray之间的区别<int>();

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

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

有些情况下类型是必需的,因为它不能被推断。例如,您有一个自定义集合,该集合实现了两次不同类型IEnumerable<T>两种不同的类型T。这会伤害可用性,所以最好避免这种构造。

4

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

3

它们是相同的东西。你目睹了所谓的“类型推断”。在某些情况下,C#编译器可以根据传入的参数来检测类型,并且不必显式指定类型参数。在你的例子中,已知iIEnumerable<int>,因此.ToArray()可以推断参数int

这里是一个很好的文章说进入这个深度:http://joelabrahamsson.com/a-neat-little-type-inference-trick-with-c/

5

没有区别,它是完全相同的ToArray()方法。编译器可以简单地推断出您需要表达式语法中的ToArray<int>版本。 Where()的返回值被推断为返回int。换句话说,它使用Where<int>()。这是从列表<>的类型推断的。所以可以推断你需要ToArray<int>

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

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

2

没有区别。

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>()
  • 如果您调用泛型方法并且不提供任何类型参数,编译器会尝试为您推断它们。