根据函数的表达式实参推断第二个泛型形参
本文关键字:第二个 泛型 形参 实参 函数 表达式 | 更新日期: 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
,然后在x
为S
类型的环境中推断表达式bar
的类型。 -
bar
的类型给了我们TKey
的类型,我们完成了。
如果不能进行部分类型推断,则…
部分类型推断不是不可能的。相反,它不是实现的。在c#中添加这个特性是可能的;没有人这样做过。
无论是否实现或可能从部分边界集进行推理,在调用OrderByDescending
时对所有类型进行完整推理都没有困难。显然,我们专门设计的算法能够处理OrderByDescending
, Join
等。