【问题标题】:Delegate compiles with different return types委托用不同的返回类型编译
【发布时间】: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 = truetrue 赋值给myBool 并返回它。这就是为什么它在返回类型为 bool 时编译的原因。但我不知道为什么它会与void一起编译。似乎编译器足够聪明,可以在您将返回类型设为 void 并执行赋值时删除隐式返回
  • 除了创建新的委托MyDelegate,您可以分别使用ActionFunc<bool> 来返回void 或bool 返回无参数的委托。
  • @Servy 感谢您的回答,是的,在这种情况下避免委托声明并使用 Func 会更合适。好提示!

标签: c# lambda delegates


【解决方案1】:

为什么委托的返回类型可以同时接受 void 和 bool?

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

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

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

赋值运算符不是void返回;它解析为分配给变量的值,因此在这种情况下,它解析为true

所以用更简单的代码 sn-p:

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

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

variableanotherVariable 在运行后都将是 truevariable = true 会将true 分配给variable,返回true,然后将其分配给anotherVariable

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    • 1970-01-01
    • 2021-02-22
    • 2010-10-29
    • 1970-01-01
    • 2022-06-15
    相关资源
    最近更新 更多