如何在c#中避免不可能的布尔状态?

Bob*_*y B 11 .net c# exception-handling exception 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!");
}
Run Code Online (Sandbox Code Playgroud)

编译器坚持最后一个else子句.但从真相表的角度来看,这是一个不可能的状态.

是的,它有效,是的,我可以忍受它.但是我想知道c#中是否有一些机制来避免这种代码,或者我是否错过了一些明显的东西?

更新:
对于奖励积分,纯粹出于好奇,是否有任何语言以不同的方式处理这类事情?也许这不是一个语言问题,而是一个智能编译器(但我认为边缘情况将是难以想象的复杂).

das*_*ght 18

考虑到真值表,最后一个条件完全是超级流行.可以在不改变程序逻辑的情况下删除它,如下所示:

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();
}
Run Code Online (Sandbox Code Playgroud)

现在你有一个最后的全部if,你的编译器很高兴.您不必完全删除条件 - 我经常发现在评论中将其保留在可读性中是一个好主意.

  • 我实际上喜欢离开已注释掉的代码,因为它有效地记录了最后一个分支的条件.+1 (3认同)

Mar*_*ell 7

if(a) return b ? doAB() : doA();
else return b ? doB() : doNotAnotB();
Run Code Online (Sandbox Code Playgroud)

或更短:

return a ? (b ? doAB() : doA())
         : (b ? doB() : doNotAnotB());
Run Code Online (Sandbox Code Playgroud)


bra*_*ing 6

试试f#.如果它能够检测到与其匹配指令匹配的穷举条件,则它不需要其他.

http://ganesansenthilvel.blogspot.co.at/2011/12/f-pattern-matching.html?m=1#!

> let testAND x y =
match x, y with
| true, true -> true
| true, false -> false
| false, true -> false
| false, false -> true

> testAND true false;;
val it: bool = true
Run Code Online (Sandbox Code Playgroud)

而且规格不完整

> let testAND x y =
match x, y with
| true, true -> true
// Commented | true, false -> false 
| false, true -> false
| false, false -> true
> testAND true false;;
Run Code Online (Sandbox Code Playgroud)

编译器会说

Microsoft.Fsharp.Core.MatchFailureExcption: The match cases were incomplete at:....
Stopped due to error
Run Code Online (Sandbox Code Playgroud)