对不起,如果我问的是愚蠢的问题,但有人可以解释下面两个电话之间的区别(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>();
答案 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#编译器可以根据传入的参数检测类型,您不必显式指定类型参数。在您的示例中,已知i
是IEnumerable<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
的隐式解释。