为什么重载true和false而不是定义bool运算符?

我一直在阅读有关在C#中重载true和false的内容,我想我理解这与定义bool运算符之间的基本区别。 我看到的例子是这样的:

public static bool operator true(Foo foo) { return (foo.PropA > 0); } public static bool operator false(Foo foo) { return (foo.PropA <= 0); } 

对我来说,这跟说:

 public static implicit operator bool(Foo foo) { return (foo.PropA > 0); } 

据我所知,区别在于,通过分别定义true和false,您可以拥有一个既是真也可以是假的对象,或者既不是真也不是假:

 public static bool operator true(Foo foo) { return true; } public static bool operator false(Foo foo) { return true; } //or public static bool operator true(Foo foo) { return false; } public static bool operator false(Foo foo) { return false; } 

我确信这是允许的原因,但我想不出它是什么。 对我而言,如果您希望将对象转换为true或false,则单个bool运算符最有意义。

任何人都可以给我一个场景,以另一种方式做到这一点吗?

谢谢

正如文档所说,重载truefalse旨在支持(可空)数据库类型(是/否,Y / N,0/1等)。

当然,与任何操作员一样,您可以不一致地定义它们。 返回合理的东西是你的责任。 编译器只是要求两者都没有。

我不知道这些运营商是否存在。 这意味着你可以实现自我否定悖论:

 public class ThisClassIsFalse { public static bool operator true(ThisClassIsFalse statement) { return statement ? false : true; } public static bool operator false(ThisClassIsFalse statement) { return statement ? true : false; } } 

所以现在我们知道这个经典悖论的真正解决方案…… StackOverflowException。

根据系统的不同,true可以是任何非零值。 在其他情况下,它可以是任何正面价值。

其他系统不是真正的布尔值,并允许布尔值的第三个状态为null或nill,这就是为什么你可能会重载true和false,而不是重载一个bool运算符。

我看到人们重载truefalse重载,以便在Linq存在之前做一些聪明的事情,比如在.NET 2.0中构建表达式。

Ayende使用他的NHQG项目制定了这样的语法来构建NHibernate标准查询:

 return Repository.FindAll( (Where.Publisher.Name == name) && (Where.Publisher.City == city));