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

Ish*_*wor 4 c# generics

此问题是部分类型推断的扩展 如果无法进行部分类型推断,那么有人可以解释OrderByDescending扩展方法是如何工作的吗?请注意,当我调用OrderByDescending(m => m.DateProp)时,我不会被要求提供Type参数.

static IOrderedQueryable<TSource> OrderByDescending<TSource, TKey>(
   this IQueryable<TSource> source, 
   Expression<Func<TSource, TKey>> keySelector);
Run Code Online (Sandbox Code Playgroud)

Eri*_*ert 6

任何人都可以解释OrderByDescending扩展方法是如何工作的?

我当然可以.

static IOrderedQueryable<TSource> OrderByDescending<TSource, TKey>
(
  this IQueryable<TSource> source, 
  Expression<Func<TSource, TKey>> keySelector);
Run Code Online (Sandbox Code Playgroud)

当您调用foo.OrderByDescending( x => bar )类型推断时,请执行以下操作.

  • 首先,TSource通过检查推断出一组边界foo.
  • 然后我们问"在不知道TSource的情况下我们可以做出更多的推论吗?" 答案是否定的,所以我们将值固定TSource为绑定集的最佳成员.叫它S.
  • 然后我们问"给定TSourceis 的值S,我们可以推断出值TKey吗?是的.我们将类型值S应用于x,然后在类型为bar的环境中推断表达式x的类型S.
  • 类型bar为我们提供了类型TKey,我们已经完成了.

如果无法进行部分类型推断,......

部分类型推断并非不可能.相反,它没有实现.可以将该功能添加到C#中; 没人做过.

无论是否实现或部分边界集的推断,在调用中对所有类型进行完全推断都没有困难OrderByDescending.显然,我们专门设计了算法以便能够处理OrderByDescending,Join等等.

  • 考虑到 Eric 帮助设计了 c#,请继续并将其标记为答案。 (3认同)