考虑这个函数,您可以将其视为真值表:
public Foo doSomething(bool a, bool b) {
if ( a && b) return doAB();
else if ( a && !b) return doA();
else if (!a && b) return doB();
else if (!a && !b) return doNotANotB();
else throw new Exception("Well done, you defeated boolean logic!");
}
编译器坚持最后一个 else
子句。但从真值表的角度来看,这是不可能的状态。
是的,它有效,是的,我可以接受它。但我想知道 C# 中是否有某种机制可以避免这种代码,或者我是否遗漏了一些明显的东西?
更新:
对于奖励积分,纯粹出于好奇,是否有任何语言以不同的方式处理这类事情?也许这不是语言问题,而是智能编译器之一(但我想边缘情况会复杂得难以想象)。
最佳答案
考虑到真值表,最后一个条件完全是多余的。可以在不改变程序逻辑的情况下删除它,如下所示:
public MyType doSomething(bool a, bool b) {
if ( a && b) return doAB();
else if ( a && !b) return doA();
else if (!a && b) return doB();
else/*if (!a && !b)*/ return doNotANotB();
}
现在你有了一个最终的包罗万象的 if
,你的编译器很高兴。您不必完全删除该条件 - 我经常发现将其保留在评论中以提高可读性是个好主意。
关于c# - 如何避免在 C# 中出现不可能的 bool 状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13330992/