考虑一下这个函数,您可以将其视为真值表:
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/