假设我有一个看起来像这样的课程:
public class MyClass
{
public delegate void MyDelegate();
public static void DoWork(MyDelegate aDelegate)
{
aDelegate();
}
}
我有一些看起来像的代码:
var myBool = false;
MyClass.DoWork(() => myBool = true);
以上构建符合预期。我无法理解的是,如果我将MyDelegate上的返回类型更改为bool,它仍然构建。最重要的是,如果我将返回类型改为say,int,则lambda将显示编译错误:
Cannot convert expression type 'bool' to return type 'int'.
这给我留下了两个问题:
为什么委托的返回类型都可以接受void和bool?
为什么我的lambda bool上的表达式类型?它不是无效吗?
谢谢!
答案 0 :(得分:2)
为什么委托的返回类型都可以接受void和bool?
Lambda在这方面相当不寻常。它们是C#中很少有上下文的表达式之一,也就是说它们根据使用表达式的上下文做了不同的事情。
在这种情况下,编译器会查看您尝试将lambda分配给的内容,并在确定该lambda的类型时使用它。它看到lambda需要是MyDelegate
类型,并尝试将lambda与该委托匹配。您已解析为表达式为bool
的lambda,但如果委托的类型为void
,则返回类型将被忽略,允许您将一个非void lambda分配给返回的void委派。
为什么我的lambda bool上的表达式类型?它不是无效的吗?
赋值运算符不会void
返回;它解析为分配给变量的值,因此在这种情况下,它会解析为true
。
所以使用更简单的代码片段:
bool variable;
bool anotherVariable = (variable = true);
(这里的括号不是必需的,只是为了清楚执行的顺序。)
运行此操作后, variable
和anotherVariable
都将为true
。 variable = true
会将true
分配给variable
,返回true
,然后将其分配给anotherVariable
。