You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中显式指定Lambda参数类型:三段表达式是否等价?

关于C# Lambda表达式与方法组的等价性问题

嘿,咱们来掰扯清楚这三段代码是不是完全等价哈!先回顾下你给出的基础方法定义:

void Foo<T>(T x) {}
void Bar<T>(Action<T> a) {}

接下来逐个拆解那三个调用:

  • 第一段:Bar<int>(x => Foo(x));
    这里明确指定了Bar的类型参数是int,Lambda里的参数x会被自动推断为int类型。调用Foo(x)时,编译器也会把Foo的类型参数推断为int,最终就是把指向Foo<int>的委托传给Bar<int>。

  • 第二段:Bar((int x) => Foo(x));
    这次没给Bar指定类型参数,但Lambda里明明白白写了x是int,编译器会顺着这个信息推断出Bar的类型参数是int,后续调用Foo(x)的逻辑和第一段完全一致——还是生成指向Foo<int>的委托传给Bar<int>。

  • 第三段:Bar<int>(Foo);
    这里用了方法组Foo,编译器会自动把它转换成Action<int>类型的委托,因为Bar<int>正好需要这个类型的参数,而Foo<int>的签名(接受一个int参数、无返回值)完美匹配Action<int>的要求。本质上和前两段的结果一模一样,都是把Foo<int>的委托传给Bar<int>。

结论

这三段代码完全等价!编译器最终生成的IL代码几乎没有区别,核心逻辑都是创建指向Foo<int>的Action<int>委托,并传递给Bar<int>方法。

内容的提问来源于stack exchange,提问作者Huibin Zhang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:12:00