空值合并运算符(??)与返回

7
我很想知道为什么在 C# 7.0 中可以这样做:
int? test = 0;
int test2 = test ?? throw new Exception("Error");

但不包括这个:

int? test = 0;
int test2 = test ?? return;

有人能解释一下吗?


我认为第一个不会编译。 - 41686d6564 stands w. Palestine
请自行测试 - Twenty
4
因为throw现在是一个表达式,而return不是(语句)。 - Caramiriel
是的,在C# 6.0中它无法编译。我还没有在C# 7.0上有太多的经验。 - 41686d6564 stands w. Palestine
除此之外,我认为这也适用:https://meta.stackoverflow.com/questions/293815/is-it-subjective-to-ask-about-why-something-wasnt-implemented-in-the-language/293819#293819 - Caramiriel
2个回答

9
在C# 7.0中,throw被转化为表达式来实现这一点,而return始终只是语句。 ??运算符需要一个表达式,而不是语句。 这是C#设计人员的任意选择,特别是为了允许在??中使用throw请参阅关于throw 表达式的文档。

非常感谢,这有点令人难过,因为它可以节省一些代码! - Twenty

1
因为没有人以这种方式实现。或者更准确地说,因为return不是一个表达式。
在C# 7.0之前,throw只是一个语句,但随后由于提议而被扩展为表达式(null合并运算符仅支持表达式)。
所以,除非有人建议将return作为表达式,否则它将无法工作。

你在哪里可以提出建议呢? - Twenty
在 C# 编译器的 Github 页面上 - adjan
@Twenty 确切无误 - adjan

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