许多语句(在 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();
陈述有何不同?
在您的两个 LINQ 语句中,TSource
类型都是必需的。
它只是在第一个语句中明确提供,在第二个语句中隐式推断。
您可以TSource
在编译器无法推断类型的情况下指定 - 通常是在 lambda 嵌套且非常复杂的情况下。
此外,如果您希望使用 lamdba 中使用的超类型类型执行操作。例如,您可以指定Fruit
类型而不是让它推断Apple
是否Apple
继承自Fruit
.
最后,您可以选择指定(或不指定)TSource
只是为了使您的代码更具可读性 - 通过显式包含类型或删除冗余类型重复。
因为有时(我的意思是有时)如果我们没有定义TSource
,那么它就无法从它的使用中检测到它的类型,即它的 lambda 表达式。
有时如果我们不提供TSource
.
在您的情况下,如果我们不提供它是可以的。
通常它是完全多余的,没有任何实际用途。我怀疑某些代码工具(例如重构引擎)即使没有必要也会添加通用参数。
Resharper 将它们标记为多余的,我通常会删除它们。他们不添加有价值的信息,也不(通常)记录重要的事情。