在C#中使用<tsource>的通用方法声明

时间:2019-04-04 02:52:11

标签: c# .net

我是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(...)

1 个答案:

答案 0 :(得分:5)

签名为

public static IQueryable<TSource> Where<TSource> (this IQueryable<TSource> source,...)

之所以可以调用SomeQueryable.Where(r => ...)是因为类型推断

Generic Methods (C# Programming Guide)

  

编译器可以根据方法推断类型参数   您传入的参数;它不能仅从   约束或返回值。因此类型推断不起作用   没有参数的方法。 类型推断在编译时发生   编译器尝试解析重载方法之前的时间   签名。编译器将类型推断逻辑应用于所有泛型   具有相同名称的方法。在过载解决步骤中,   编译器仅包含类型推断的一般方法   成功。

注意 :类型推断有一些警告,编译器只能以全有或全无的方式推断类型,这意味着它必须推断所有类型,否则我将推断,相反,这称为部分推断,.Net不支持。 < / p>