抛出表达式不适用于布尔表达式?

时间:2017-09-18 15:22:22

标签: c# throw c#-7.0

投掷表达式适用于这种情况:

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" );

2 个答案:

答案 0 :(得分:8)

From the original proposal on github

  

仅在以下语法上下文中允许 throw表达式

     
      
  • 作为三元条件运算符?:
  • 的第二个或第三个操作数   
  • 作为空合并运算符的第二个操作数??
  •   
  • 作为一个表达身体的lambda或方法的身体。
  •   

这是唯一可以使用throw表达式的三种情况。因此,您不会在布尔表达式中使用throw,并且语法无效。

答案 1 :(得分:1)

答案是,"因为规范说我不能"。但更有趣的问题是,为什么规范会这样说?简而言之,我认为这是因为它会破坏布尔逻辑。 throw表达式没有布尔值。抛出表达式只是语法的捷径。我们只能在抛出表达式的返回值或缺乏值时无法解决问题。另一方面,要使布尔逻辑起作用,返回值 很重要。