Action委托能否指向带返回值的方法?求解析编译差异逻辑
Action委托能不能指向带返回值的方法?
嘿,这个问题问到点子上了!我来给你拆解清楚这里面的逻辑~
首先得明确Action委托的本质:它是专门用于无返回值的方法的委托,核心定义大概是这样的:
public delegate void Action(); // 还有带参数的重载,比如 Action<T>, Action<T1,T2> 等等,但所有重载的返回值都是void
从委托签名匹配的规则来说,一个方法要能直接赋值给委托,必须满足参数列表完全对应,且返回值类型完全匹配。所以直接把带返回值的方法(比如返回int、string的方法)赋值给Action,编译器肯定会报错——因为方法的返回值类型(比如int)和Action要求的void不匹配。举个典型的错误例子:
// 带返回值的方法 int GetNumber() { return 42; } // 直接赋值方法组给Action → 编译失败! Action myAction = GetNumber;
那为什么你说有的代码能正常编译呢?大概率是用了**lambda表达式做“适配器”**的写法!比如:
// 用lambda包裹带返回值的方法 → 编译通过! Action myAction = () => GetNumber();
这时候的逻辑是:这个lambda表达式本身是一个无返回值的匿名方法——它内部调用了GetNumber(),但编译器会自动忽略掉GetNumber的返回值,所以这个lambda的签名完全符合Action的要求(无参数、无返回值),自然就能顺利赋值了。
最后给你划个清晰的重点:
- 直接用方法组(也就是方法名本身)赋值给
Action:不行,因为签名不匹配; - 用lambda/匿名方法包裹带返回值的方法:可以,因为包裹后的匿名方法签名和
Action一致,返回值被自动忽略。
内容的提问来源于stack exchange,提问作者Maitrai Basak
相关产品推荐
相关产品推荐

