【问题标题】:Infer second generic parameter based on the expression argument of the function根据函数的表达式参数推断第二个泛型参数
【发布时间】:2016-10-31 06:05:47
【问题描述】:

这个问题是 Partial type inference 如果无法进行部分类型推断,谁能解释一下 OrderByDescending 扩展方法是如何工作的?请注意,当我调用 OrderByDescending(m=>m.DateProp) 时,不会要求我提供 Type 参数。

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

【问题讨论】:

  • 嗯,它知道TSource 来自source,它知道TKey 从你的lambda 的返回类型——你认为它缺少什么?请注意,您链接的问题是关于明确提供部分类型集 - 您明确提供零类型。

标签: c# generics


【解决方案1】:

谁能解释一下 OrderByDescending 扩展方法是如何工作的?

我当然可以。

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

当您调用foo.OrderByDescending( x =&gt; bar ) 时,类型推断如下。

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

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

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

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

【讨论】:

  • 考虑到 Eric 帮助设计了 c#,请继续并将其标记为答案。
猜你喜欢
  • 2020-09-24
  • 2011-10-11
  • 2021-12-20
  • 2018-10-20
  • 2019-11-25
  • 1970-01-01
  • 2021-11-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多