Linq语句中TSource的重点是什么?

时间:2012-06-07 10:38:32

标签: c# linq

许多语句(经常在Linq中看到)在编译或执行时不需要使用TSource。你为什么要指定TSource?

示例:

 List<int> list = new List<int>(5) { 0, 1, 2, 0, 3 };

 int x = list.Where<int>(i => i == 0).FirstOrDefault<int>();
 int y = list.Where(i => i == 0).FirstOrDefault();

这些陈述有何不同?

3 个答案:

答案 0 :(得分:6)

在两个LINQ语句中都需要TSource类型。

它只是在第一个语句中明确提供,并在第二个语句中隐式推断

在编译器无法推断类型的情况下,您可以指定TSource - 通常在lambda嵌套且非常复杂时。

此外,如果您希望使用lamdba中使用的超类型执行操作。例如,如果Fruit继承自Apple,您可以指定Apple类型而不是推断Fruit

最后,您可以选择指定(或不指定)TSource只是为了使您的代码更具可读性 - 通过明确包含类型或删除冗余类型重复。

答案 1 :(得分:1)

因为有时候(有时候我的意思是)如果我们没有定义TSource那么它就无法从它的用法中检测出它的类型,即它的lambda表达式。

如果我们不提供TSource,有时我们不会收到此错误。

在你的情况下,如果我们不提供它就没问题。

答案 2 :(得分:1)

通常它完全是多余的,不能用于任何真正的目的。我怀疑像重构引擎这样的代码工具即使没有必要也会添加泛型参数。

Resharper标记那些冗余,我通常删除它们。它们不会添加有价值的信息,也不会(通常)记录重要信息。