表达式主体成员如何区分void和非void?

6
使用C# 6的表达式主体成员,我可以这样写: public string FullName => $"{_firstName} {_lastName}";
我还可以这样写:
static void Print(string message) => Console.WriteLine(message);
在第一个示例中,表达式返回了某些内容。在第二个示例中,它则没有返回任何值。
为了确定如何“操作”,它发生了什么以不需要任何附加语法?或者说它只是在编译时查看方法签名?
我不喜欢把事情留给“自动处理”,而不知道发生了什么。

1
我认为$"..."只是String.Format(...)的简写版本,毫无疑问会返回一个字符串。 - MakePeaceGreatAgain
1
这是另一个C# 6功能,称为字符串插值。也许我在使用它作为测试片段时有些混淆了。我的问题更多地涉及表达式语法如何决定返回什么以及何时返回。 - user1017882
在你的第二个示例中,返回类型是 void,是吗?这方面没有更多的编译器决定。我不明白你的问题。 - MakePeaceGreatAgain
@AlexanderDerck 如果方法返回一个字符串而不是void呢?这与实际推断的类型无关。 - MakePeaceGreatAgain
@HimBromBeere static string Print(string message) => message;?这只是另一种编写Action<T>Func<T>的方式。 - Alexander Derck
显示剩余2条评论
1个回答

4
首先,FullName 是一个属性。它总是返回一个值。因此,函数主体的签名应为 Func<T>,其中 T 是返回类型(在您的示例中定义为 string)或等效委托。
您的方法 void Print(string message) 的签名是 Action<string>,因为编译器知道 void 不返回任何值,并且需要一个参数。编译器可以理解某些语句会返回一个值(例如 => "a"),某些语句可以自己独立成立(虽然它们可能会返回一个值,例如 => new object())。因此,如果出现错误,它可以告诉您:"CS0201:只有赋值、调用、递增、递减和新对象表达式可以用作语句"。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接