投掷表达式适用于这种情况:
string myStr;
public MyObj( string myStr ) =>
this.myStr = myStr ?? throw new ArgumentNullException( "myStr" );
但为什么不编译?
bool isRunning;
public void Run() =>
isRunning = !isRunning || throw new InvalidOperationException( "Already running" );
答案 0 :(得分:8)
From the original proposal on github:
仅在以下语法上下文中允许 throw表达式:
- 作为三元条件运算符
的第二个或第三个操作数?:
- 作为空合并运算符的第二个操作数
??
- 作为一个表达身体的lambda或方法的身体。
这是唯一可以使用throw表达式的三种情况。因此,您不会在布尔表达式中使用throw,并且语法无效。
答案 1 :(得分:1)
答案是,"因为规范说我不能"。但更有趣的问题是,为什么规范会这样说?简而言之,我认为这是因为它会破坏布尔逻辑。 throw表达式没有布尔值。抛出表达式只是语法的捷径。我们只能在抛出表达式的返回值或缺乏值时无法解决问题。另一方面,要使布尔逻辑起作用,返回值 很重要。