【问题标题】:Void-type method expression-bodied member allows expression of non-void type *if other method*void 类型方法表达式体成员允许非 void 类型的表达式 *如果其他方法*
【发布时间】:2016-07-18 01:58:37
【问题描述】:

我不知道这是怎么回事,我在玩 C# 中的有表情的成员,我发现了一些奇怪的地方。

本质上,如果您创建一个具有 void 返回类型的方法表达式体成员,您仍然可以使用非 void 返回类型的方法作为表达式。

例子:

public void MethodA() { }
public void MethodB() => MethodA();

按预期工作。

public string MethodA() { return "MethodA"; }
public void MethodB() => MethodA();

编译得很好(我没有运行它来测试,但它编译的事实让我感到困惑)。这让我很困惑,就像我在脑海中看到的那样:

public void MethodB() { return MethodA(); }

这显然是无效的,因为return 语句实际上返回了一个值,这在void 方法中是不允许的。

但是,奇怪的是以下内容无法编译:

public void MethodC() => "MethodC";

并给出“仅赋值...”错误。

为什么会这样?这是有意的,还是某种错误?有什么我想念的吗?如果它是另一种方法,是否允许表达式主体成员丢弃表达式的结果?

【问题讨论】:

    标签: c# function methods return expression


    【解决方案1】:

    这让我很困惑,就像我在脑海中看到的那样:

    public void MethodB() { return MethodA(); }
    

    这实际上是不正确的;生成的实际语法是这样的:

    public void MethodB() { MethodA(); }
    

    这很好。返回值被忽略。

    "MethodC" 代码片段不是可以使结果无效的方法。它是一个实际值,需要根据 C# 语法进行分配。常规语句也是如此:将"MethodC"; 放在空行上会失败。

    【讨论】:

    • 有趣,考虑到我的实验,这很有意义。我想我只是假设 C# 没有将 void 方法与其他表达式区别对待,显然我错了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    • 2020-09-13
    • 1970-01-01
    • 1970-01-01
    • 2023-02-02
    相关资源
    最近更新 更多