【问题标题】:Throw Expressions not working for Boolean expressions?抛出表达式不适用于布尔表达式?
【发布时间】:2023-03-15 23:45:01
【问题描述】:

Throw 表达式在这种情况下有效:

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

【问题讨论】:

标签: c# throw c#-7.0


【解决方案1】:

From the original proposal on github:

throw 表达式仅在以下句法上下文中被允许:

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

这是可以使用 throw 表达式的仅有的三种情况。因此,您在布尔表达式中使用 throw 没有被涵盖并且不是有效的语法。

【讨论】:

  • @HappyNomad:你不需要它在更多情况下工作。你可以说isRunning = isRunning ? throw ... : true;,完成。虽然坦率地说,你最好简单地编写代码:if (isRunning) throw ... ; isRunning = true; 就可以了。
  • @HappyNomad:去 github。搜索 C# 项目。在该项目中搜索“抛出表达式”。找到会议记录。阅读它们。
  • @EricLippert Github 的内置搜索引擎很烂。在制作了足够的Google query之后,我终于找到了this。但是对于 Throw 表达式,它只说,“它们可以作为表达式体,作为 ?? 的第二个操作数,以及 ?: 的第二个和第三个操作数。它们不允许在 && 和 || 中,并且不能用括号括起来. 我们认为这是一个着陆的好地方。”
  • @HappyNomad:如果您对设计团队的评论不满意,请与他们联系;我对此无能为力。我已经五年没有加入设计团队了。我的观点是,如果这就是你想知道的,那么在这里问并不是找到答案的方法。如果您想了解 C# 设计过程,请访问 github。
【解决方案2】:

答案是,“因为规范说我不能”。但更有趣的问题是,为什么规范会这么说?简而言之,我认为这是因为它会弄乱布尔逻辑。 throw 表达式没有布尔值。抛出表达式只是语法上的一种快捷方式。只有当 throw 表达式的返回值或缺少返回值无关紧要时,我们才能摆脱它。另一方面,要使布尔逻辑起作用,返回值确实很重要。

【讨论】:

    猜你喜欢
    • 2010-09-21
    • 2023-03-23
    • 2012-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多