为什么重载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运算符最有意义。
任何人都可以给我一个场景,以另一种方式做到这一点吗?
谢谢
正如文档所说,重载true
和false
旨在支持(可空)数据库类型(是/否,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运算符。
我看到人们重载true
和false
重载,以便在Linq存在之前做一些聪明的事情,比如在.NET 2.0中构建表达式。
Ayende使用他的NHQG项目制定了这样的语法来构建NHibernate标准查询:
return Repository.FindAll( (Where.Publisher.Name == name) && (Where.Publisher.City == city));