委托编译具有不同的返回类型

时间:2015-03-24 20:57:55

标签: c# lambda delegates

假设我有一个看起来像这样的课程:

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上的表达式类型?它不是无效吗?

谢谢!

1 个答案:

答案 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);

(这里的括号不是必需的,只是为了清楚执行的顺序。)

运行此操作后,

variableanotherVariable都将为truevariable = true会将true分配给variable,返回true,然后将其分配给anotherVariable