使用不同的 return 类型进行委托编译

Delegate compiles with different return types

假设我有一个 class 看起来像:

public class MyClass
{
    public delegate void MyDelegate();

    public static void DoWork(MyDelegate aDelegate)
    {
         aDelegate();
    }
}

我有一些代码如下所示:

var myBool = false;
MyClass.DoWork(() => myBool = true);

以上构建符合预期。我无法理解的是,如果我将 MyDelegate 上的 return 类型更改为 bool,它仍然会生成 。最重要的是,如果我将 return 类型更改为 int,lambda 将显示编译错误:

Cannot convert expression type 'bool' to return type 'int'.

这给我留下了两个问题:

为什么代表的 return 类型可以接受 void 和 bool?

为什么我的 lambda 上的表达式类型是 bool?不是void吗?

谢谢!

Why is both void and bool acceptable for the delegate's return type?

Lambda 在这方面很不寻常。它们是 C# 中为数不多的上下文表达式之一,也就是说,它们根据使用表达式的上下文执行不同的操作。

在这种情况下,编译器会查看您尝试将 lambda 分配给什么,并使用它来确定该 lambda 的类型应该是什么。它发现 lambda 需要是 MyDelegate 类型,并尝试将 lambda 与该委托匹配。您拥有的 lambda 解析为 bool 类型的表达式,但如果委托是 void 类型,则 return 类型将被忽略,从而允许您分配一个非 void lambda无效 returning 代表。

Why is the expression type on my lambda bool? Is it not void?

赋值运算符不是 void return;它解析为分配给变量的值,因此在本例中,它解析为 true.

所以使用更简单的代码片段:

bool variable;
bool anotherVariable = (variable = true);

(此处不需要括号,只是为了清楚执行顺序。)

在 运行 之后 variableanotherVariable 都将是 truevariable = true 会将 true 分配给 variable、return true,然后将其分配给 anotherVariable.