Windows窗体扩展方法Invoke()不接受lambda表达式,我们不必首先将其类型转换为类似Action的委托类型。这让我想知道,如果lambda表达式(带有正文)不是显式的委托,也不是表达式,它的类型是什么?
答案 0 :(得分:6)
这让我想知道,如果lambda表达式(带有正文)不是显式委托或表达式,那么它的类型是什么?
它没有正常意义上的单词类型(即CLR类型),就像null
没有类型一样。 (较早版本的C#规范具有“null类型”的概念,但已被删除。)
相反,它是一个可转换为任何兼容的具体委托或表达式树类型的表达式。
有关详细信息,请参阅C#5规范的第7.1节(“表达式分类”) - 相关的要点(表达类型列表中):
- 空文字。具有此分类的表达式可以隐式转换为引用类型或可空类型。
- 匿名函数。具有此分类的表达式可以隐式转换为兼容的委托类型或表达式树类型。
答案 1 :(得分:1)
Delegate
是所有代表的abstract
基类(MulticastDelegate
介于其间)。 Lambda无法转换为Delegate
类型,因为它无法实例化,并且它没有任何签名。
所以,你需要更具体地说出你感兴趣的代表类型。
它的类型是什么?
它没有类型,如果签名兼容,它可以转换为任何委托类型或Expression<TDelegate>
类型。