【发布时间】:2019-09-16 15:56:05
【问题描述】:
正如您在C# documentation 中看到的那样,我们可以编写空合并运算符结合 throw 表达式,如下所示
public string Name
{
get => name;
set => name = value ??
throw new ArgumentNullException(paramName: nameof(value), message: "Name cannot be null");
}
但在很多情况下,如果左值为空,我需要返回语句,例如下面的内容
public double CalculateSomthing(ClassType someInstance)
{
var someValue = someInstance?.Value ?? return double.NaN;
// Call some method
AnyMethod(someValue);
// Some Computation
return someValue + 17;
}
但我知道我无法编写类似上面的代码,我的问题是为什么?为什么 C# 语言设计器允许使用 null 合并运算符编写 throw 表达式,但不允许使用带有合并运算符的 return 语句?
它们之间有什么本质区别吗?
在现有的 C# 版本中是否有类似上述示例的解决方案?或者我必须编写一些样板代码,如下所示
public double CalculateSomthing(ClassType someInstance)
{
var someValue = someInstance?.Value;
if (someValue == null) return double.NaN; // Boiler plate
// Call some method
AnyMethod(someValue);
// Some Computation
return someValue + 17;
}
【问题讨论】:
-
你可以写这样的代码since C# 6。 throw 表达式是在 C# 7 中添加的。
-
@LGSon OP 要求
return表达式 而不是return语句。就像throwstatement 已从 C#6 更改为 C#7 一样,它可以用于编译器通常需要 expression 的地方。他们不想在第一个值为空的情况下继续该方法,而是只想返回而不是抛出。这在技术上是可行的,但显然没有人对此提出足够的要求,也没有人愿意实施、测试、记录和发布它。 -
someValue??double.NaN有效。你尝试了什么,失败了什么?您确定问题不在于??之后的无效返回语句吗? -
@PanagiotisKanavos 无效语句是 OP 所要求的:
return表达式(而不是语句),就像有一个throw表达式一样。他们想要返回右侧的值,以防左侧的值为空。 -
您可以在 C# Language GitHub 页面上发布提案。如果它适用于冠军,也许您会在即将推出的语言版本中看到此功能。
标签: c# null-coalescing-operator c#-8.0