繁体   English   中英

C#中实际的lambda类型是什么?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM