![]() |
1
27
首先,“lambda表达式”只是表达式的形式部分
总之,如果我能教人们一件关于Linq的事情,那就是:“结果”不是 结果 关于这个问题, 是查询本身 . 如果要查看结果,请查询每个结果:
当然。我们首先计算出所涉及的所有类型。我们看到lambda是一个接受keyValuePair并返回int的函数,因此我们生成一个方法
接下来,我们采用该方法并从中创建委托:
重写扩展方法调用:
重写var:
我希望您同意,您输入的代码比这一团糟的代码可读性要好得多。类型推断岩。 结果是一个对象,它表示按给定键对字典排序的能力。仔细阅读:它代表 能力 按那个键对字典排序。直到你要求一个结果,它才真正做到这一点;到目前为止,它只是一个对象,上面写着“当要求一个结果时,按这个键对字典进行排序”。 假设你要求一个结果。它如何计算排序列表?它向字典询问每个元素。然后它对每个元素调用mylambda,这会返回一个整数,所以我们现在有了一对字典键值对和整数。然后,它构建一个按该整数排序的对列表。然后它一次一个地分发列表中的元素,正如您所要求的那样。
啊,我看到了困惑;出于教学原因,我在语义分析的确切顺序上撒了一点谎。 我们如何进行这种类型推理是C中更微妙和有趣的部分之一。 这就是它的工作原理。 我们看到orderByDescending声明为:
我们看到有一个对这个方法的潜在调用:
但我们不知道T和K是什么。所以我们从所有不是lambda的东西开始。你的字典实现了
在这一点上,我们无法从那些不是lambda的东西中推断出其他的东西,所以我们开始研究lambda。我们看到我们有一个lambda
我们问 它是否结合 ?对!是的。我们可以成功地编译这个lambda而不出错,当我们这样做时,我们看到它的所有返回语句都返回一个int。 因此,我们推断k是int,现在我们对整个事物进行了一个完整的类型分析。 这是一个相当直截了当的推论;他们可能会变得更加奇怪。如果您对这个主题特别感兴趣,请参阅我博客上的“类型推断”档案。 http://blogs.msdn.com/ericlippert/archive/tags/Type+Inference/default.aspx 特别是,这里有一段我解释上述内容的视频,还有一些其他有趣的案例: http://blogs.msdn.com/ericlippert/archive/2006/11/17/a-face-made-for-email-part-three.aspx |
![]() |
2
2
orderByDescending函数将返回IEnumerable,实际上是IOrderenumerable,其中tsource是原始可枚举的类型源。 使用字典时,orderByDescending将返回:
对象,将根据提供的表达式进行排序。 |
![]() |
3
1
这条线给你一个
这意味着它接受
|
![]() |
4
0
为了完整的回答文档,我使用更通用的“项”以及更具体的“可撤销”来打印输出。
|
![]() |
Michael Runzler · 动态类型化方法中的奇数型推理 7 年前 |
![]() |
K.Os · Kotlin和RxJava类型推断失败 7 年前 |
![]() |
Crazycolorz5 · (^)上的类型推断问题 7 年前 |
![]() |
Josh Stone · Scala类型推断错误 8 年前 |
![]() |
LazyHatIQ · 类型脚本类型推断、扩展语法和多类型返回 8 年前 |