c# - 如何避免在 C# 中出现不可能的 bool 状态?

标签 c# .net exception exception-handling truthtable

考虑这个函数,您可以将其视为真值表:

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/

相关文章:

.net - "Could not load file or assembly"使用团队城市构建时

.net - 如何通过 .NET 中的线程传播 tcplistener 传入连接?

c# - 按钮 Onclick 事件不起作用

c# - 绑定(bind)到 WPF MVVM 中的鼠标事件

c# - 如何从它绑定(bind)到的 DataRow 中确定 DataGridViewRow

c# - 无法让 C# 中的 SslStream 接受 .net Framework 4.6 的 TLS 1.2 协议(protocol)

c++ - 异常:循环中内存位置的 std::bad_alloc

perl - 如何在Template Toolkit文件中找到出现错误的行?

php - 为什么在php中报告异常时使用new

c# - 代码清理在插值字符串中添加空格