不允许在 C# 语句中使用短路函数调用
本文关键字:短路 函数调用 语句 不允许 | 更新日期: 2023-09-27 18:36:43
我正在尝试在两个函数调用之间使用短路。以以下代码为例:
private void BubbleDown(Graph.Vertex item)
{
BubbleDownLeft(item) || BubbleDownRight(item);
}
其中 BubbleDownLeft
和 BubbleDownRight
都返回布尔值。这将引发以下错误:
错误 CS0201 - 只能将赋值、调用、递增、递减和新对象表达式用作语句
我知道我可以轻松地重写函数以使用 if 语句(但这并不那么漂亮),甚至只是将其分配给我不使用的值:
private void BubbleDown(Graph.Vertex item)
{
bool ignoreMe = BubbleDownLeft(item) || BubbleDownRight(item);
}
那么,为什么我的第一个编码示例是一个错误而不是有效,或者只是一个警告?
建议的代码对计算机没有意义。当你要求它BubbleDown()
时,你告诉它要么BubbleDownLeft()
要么BubbleDownRight()
,但也要忽略结果。编译器没有动力使用短路计算,因为结果无论如何都会被忽略。如果这是一个if
的声明,那么这种短路评估就是开始的。
在评论中,您声明:
我同意无关
ignoreMe
比if
更糟糕,但原文很容易阅读。它清楚地表明,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);
另外,看看这个埃里克·利珀特的答案。