不允许在 C# 语句中使用短路函数调用

本文关键字:短路 函数调用 语句 不允许 | 更新日期: 2023-09-27 18:36:43

我正在尝试在两个函数调用之间使用短路。以以下代码为例:

private void BubbleDown(Graph.Vertex item)
{
    BubbleDownLeft(item) || BubbleDownRight(item);
}

其中 BubbleDownLeftBubbleDownRight 都返回布尔值。这将引发以下错误:

错误 CS0201 - 只能将赋值、调用、递增、递减和新对象表达式用作语句

我知道我可以轻松地重写函数以使用 if 语句(但这并不那么漂亮),甚至只是将其分配给我不使用的值:

private void BubbleDown(Graph.Vertex item)
{
    bool ignoreMe = BubbleDownLeft(item) || BubbleDownRight(item);
}

那么,为什么我的第一个编码示例是一个错误而不是有效,或者只是一个警告?

不允许在 C# 语句中使用短路函数调用

建议的代码对计算机没有意义。当你要求它BubbleDown()时,你告诉它要么BubbleDownLeft()要么BubbleDownRight(),但也要忽略结果。编译器没有动力使用短路计算,因为结果无论如何都会被忽略。如果这是一个if的声明,那么这种短路评估就是开始的。

在评论中,您声明:

我同意无关ignoreMeif更糟糕,但原文很容易阅读。它清楚地表明,bubbleDown是左派或右派的结果。以a,b,c,d,e为例,您必须输入看起来像e()是目标的if (!(a() || b() || c() || d())) e()),但实际上这是一条5分支路径,其中采用了成功的第一条路径。

这清楚地表明您想要短路评估,并且您获得此评估的选项是更改返回类型并执行以下操作:

private bool BubbleDown(Graph.Vertex item)
{
    return BubbleDownLeft(item) || BubbleDownRight(item);
}

或者,您可以选择带有空块的if语句。请注意 if 语句后面的;

private void BubbleDown(Graph.Vertex item)
{
   if (BubbleDownLeft(item) || BubbleDownRight(item)) ;
}

我想我更喜欢第一个,然后在您的调用BubbleDown()点忽略返回值,或者实际验证它是否确实真实地执行了任何选项。

使用 C# 6,您可以更加优雅:

private bool BubbleDown(Graph.Vertex item)
    => BubbleDownLeft(item) || BubbleDownRight(item);

但是,无论如何,通过这种方式,您将更改方法返回类型。

如果您严格来说想要像这样编写代码,而不更改BubleDown签名,则可以使用 C# 6 表达式主体函数做一些技巧:

private void BubbleDown(Graph.Vertex item)
    => BubbleDownImplementation(item);
private bool BubbleDownImplementation(Graph.Vertex item)
    => BubbleDownLeft(item) || BubbleDownRight(item);

另外,看看这个埃里克·利珀特的答案。