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
相关产品推荐
相关产品推荐

