![](/img/trans.png)
[英]What are C# lambda's compiled into? A stackframe, an instance of an anonymous type, or?
[英]What's the actual type of lambda in C#?
我读到C#lambdas可以被非法转换为Action或Func,但是lambda不能直接执行定义lambda函数并立即执行它例如:
int n = (()=>5)(); //doesn't work
int n = ((Func<int>)(()=>5))(); //works
那么lambda的实际类型是什么?为什么不能直接调用它? 是因为C#类型系统比Haskell或Scala系统“弱”吗?
lambda表达式没有类型。 它不能,因为它可能拥有的.NET世界中的任何类型,也会硬编码lambda的参数和结果的类型。 现在考虑:
x => x + 1
x
可以使用什么类型? 结果是什么类型的? 没有任何单一答案,lambda表达式确实可以转换为Func<int, int>
, Func<double, double>
和许多其他具有不同参数的委托类型。 给lambda表达式一个类型会禁止这样的表达式。 C#确实想要允许这样的表达式,所以设计的不是给这样的表达式任何类型。
这是因为() => 5
可以与各种委托类型兼容(例如,您可能有一个不带任何东西并返回int
的自定义delegate
)。 并且为了创建delegate
,编译器必须知道确切的类型。 它不能只选择适合您需求的随机类型。 这就是为什么除非你将它转换为实际的委托类型,否则你不能Invoke
它。
在类似于方法需要delegate
,编译器会隐式执行该转换:
void Foo(Func<int> func) { }
Foo(() => 5);
同样重要的是要知道delegates
实际上是幕后的类。 每次创建delegate
实例时,编译器都会创建class
的实例。 因此,无论哪种方式,您都必须指定一个类型,以便编译器知道要使用哪种类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.