【发布时间】:2015-05-28 08:40:28
【问题描述】:
假设我有一个看起来像这样的类:
public class MyClass
{
public delegate void MyDelegate();
public static void DoWork(MyDelegate aDelegate)
{
aDelegate();
}
}
我有一些看起来像这样的代码:
var myBool = false;
MyClass.DoWork(() => myBool = true);
上述构建如预期。我无法理解的是,如果我将 MyDelegate 上的返回类型更改为 bool,它仍然会构建。最重要的是,如果我将返回类型更改为 int,则 lambda 将显示以下编译错误:
Cannot convert expression type 'bool' to return type 'int'.
这给我留下了两个问题:
为什么委托的返回类型既可以接受 void 又可以接受 bool?
为什么我的 lambda 表达式类型是 bool?不是无效吗?
谢谢!
【问题讨论】:
-
首先赋值表达式
myBool = true将true赋值给myBool 并返回它。这就是为什么它在返回类型为 bool 时编译的原因。但我不知道为什么它会与void一起编译。似乎编译器足够聪明,可以在您将返回类型设为 void 并执行赋值时删除隐式返回 -
除了创建新的委托
MyDelegate,您可以分别使用Action或Func<bool>来返回void 或bool返回无参数的委托。 -
@Servy 感谢您的回答,是的,在这种情况下避免委托声明并使用 Func
会更合适。好提示!