我是C#的初学者,只是有关泛型方法的问题。例如:
public static IQueryable<TResult> Where<TSource>(...)
所以我们只能像这样调用LINQ方法:
var test = _context.Recipes.Where(r => !r.IsDeleted)
代替
var test = _context.Recipes.Where<Recipe>(r => !r.IsDeleted)
那为什么我们不只是将通用方法声明为
public static IQueryable<TResult> Where(...)
答案 0 :(得分:5)
签名为
public static IQueryable<TSource> Where<TSource> (this IQueryable<TSource> source,...)
之所以可以调用SomeQueryable.Where(r => ...)
是因为类型推断
Generic Methods (C# Programming Guide)
编译器可以根据方法推断类型参数 您传入的参数;它不能仅从 约束或返回值。因此类型推断不起作用 没有参数的方法。 类型推断在编译时发生 编译器尝试解析重载方法之前的时间 签名。编译器将类型推断逻辑应用于所有泛型 具有相同名称的方法。在过载解决步骤中, 编译器仅包含类型推断的一般方法 成功。
注意 :类型推断有一些警告,编译器只能以全有或全无的方式推断类型,这意味着它必须推断所有类型,否则我将推断无,相反,这称为部分推断,.Net不支持。 < / p>