根据函数的表达式实参推断第二个泛型形参

本文关键字:第二个 泛型 形参 实参 函数 表达式 | 更新日期: 2023-09-27 18:15:33

这个问题是部分类型推理如果部分类型推断是不可能的,有人可以解释orderbydescent扩展方法是如何工作的吗?请注意,当我调用orderbydescent (m=>m. dateprop)时,我没有被要求提供Type参数。

static IOrderedQueryable<TSource> OrderByDescending<TSource, TKey>(
   this IQueryable<TSource> source, 
   Expression<Func<TSource, TKey>> keySelector);

根据函数的表达式实参推断第二个泛型形参

谁能解释orderbydescent扩展方法是如何工作的?

我当然可以。

static IOrderedQueryable<TSource> OrderByDescending<TSource, TKey>
(
  this IQueryable<TSource> source, 
  Expression<Func<TSource, TKey>> keySelector);

当您调用foo.OrderByDescending( x => bar )时,类型推断进行如下。

  • 首先通过检验foo推断出TSource的一组边界。
  • 然后我们问"在不知道TSource的情况下,我们还能做出什么推断吗?"答案是否定的,因此我们将TSource的值固定为界集中的最佳成员。命名为S
  • 然后我们问:"如果TSource的值是S,我们可以推断出TKey的值吗?"是的。我们将类型值S应用于x,然后在xS类型的环境中推断表达式bar的类型。
  • bar的类型给了我们TKey的类型,我们完成了。

如果不能进行部分类型推断,则…

部分类型推断不是不可能的。相反,它不是实现的。在c#中添加这个特性是可能的;没有人这样做过。

无论是否实现或可能从部分边界集进行推理,在调用OrderByDescending时对所有类型进行完整推理都没有困难。显然,我们专门设计的算法能够处理OrderByDescending, Join等。