3

许多语句(在 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();

陈述有何不同?

4

3 回答 3

6

在您的两个 LINQ 语句中,TSource类型都是必需的。

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

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

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

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

于 2012-06-07T10:41:18.747 回答
1

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

有时如果我们不提供TSource.

在您的情况下,如果我们不提供它是可以的。

于 2012-06-07T10:40:03.340 回答
1

通常它是完全多余的,没有任何实际用途。我怀疑某些代码工具(例如重构引擎)即使没有必要也会添加通用参数。

Resharper 将它们标记为多余的,我通常会删除它们。他们不添加有价值的信息,也不(通常)记录重要的事情。

于 2012-06-07T10:41:26.720 回答