void-type method expression-bodied 成员允许非 void 类型的表达式 *if other method*
Void-type method expression-bodied member allows expression of non-void type *if other method*
我不确定这是怎么回事,我在 C# 中玩表达式体成员,我注意到了一些奇怪的东西。
本质上,如果您创建一个方法表达式体成员,它具有 void return 类型,您仍然可以使用非 void return 类型的方法作为表达式。
示例:
public void MethodA() { }
public void MethodB() => MethodA();
按预期工作。
public string MethodA() { return "MethodA"; }
public void MethodB() => MethodA();
编译得很好(我还没有 运行 测试它,但它编译的事实让我很困惑)。这让我感到困惑,因为我在脑海中看到:
public void MethodB() { return MethodA(); }
这显然是无效的,因为 return
语句实际上 return 是一个值,这在 void
方法中是不允许的。
然而,奇怪的是以下代码无法编译:
public void MethodC() => "MethodC";
并给出 "Only assignment..." 错误。
为什么会这样?这是故意的,还是某种错误?有什么我想念的吗?如果表达式是另一种方法,是否允许表达式主体成员直接丢弃表达式的结果?
This confuses me, as in my head I see:
public void MethodB() { return MethodA(); }
这实际上是不正确的;实际生成的语法是这样的:
public void MethodB() { MethodA(); }
这很好。 return 值被忽略。
"MethodC"
代码片段不是可以使结果无效的方法。它是一个实际值,需要根据 C# 语法分配。常规语句也是如此:将 "MethodC";
放在空行上会失败。
我不确定这是怎么回事,我在 C# 中玩表达式体成员,我注意到了一些奇怪的东西。
本质上,如果您创建一个方法表达式体成员,它具有 void return 类型,您仍然可以使用非 void return 类型的方法作为表达式。
示例:
public void MethodA() { }
public void MethodB() => MethodA();
按预期工作。
public string MethodA() { return "MethodA"; }
public void MethodB() => MethodA();
编译得很好(我还没有 运行 测试它,但它编译的事实让我很困惑)。这让我感到困惑,因为我在脑海中看到:
public void MethodB() { return MethodA(); }
这显然是无效的,因为 return
语句实际上 return 是一个值,这在 void
方法中是不允许的。
然而,奇怪的是以下代码无法编译:
public void MethodC() => "MethodC";
并给出 "Only assignment..." 错误。
为什么会这样?这是故意的,还是某种错误?有什么我想念的吗?如果表达式是另一种方法,是否允许表达式主体成员直接丢弃表达式的结果?
This confuses me, as in my head I see:
public void MethodB() { return MethodA(); }
这实际上是不正确的;实际生成的语法是这样的:
public void MethodB() { MethodA(); }
这很好。 return 值被忽略。
"MethodC"
代码片段不是可以使结果无效的方法。它是一个实际值,需要根据 C# 语法分配。常规语句也是如此:将 "MethodC";
放在空行上会失败。