我一直在阅读有关在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; }
我确信这是允许的原因,但我想不出它是什么。对我来说,如果你想让一个对象能够被转换成真或假,那么一个bool算子就是最有意义的。
任何人都可以给我一个在其他方面做到这一点的情况吗?
由于
答案 0 :(得分:12)
正如the docs所说,重载true
和false
旨在支持(可空)数据库类型(是/否,是/否,0/1等)。< / p>
当然,与任何操作员一样,您可以不一致地定义它们。返回合理的东西是你的责任。编译器只是要求两者都没有。
答案 1 :(得分:8)
我不知道这些运营商是否存在。这意味着你可以实现自我否定悖论:
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。
答案 2 :(得分:2)
我看到人们重载true
和false
重载,以便在Linq存在之前做一些聪明的事情,比如在.NET 2.0中构建表达式。
Ayende使用他的NHQG项目制定了这样的语法来构建NHibernate标准查询:
return Repository.FindAll(
(Where.Publisher.Name == name) &&
(Where.Publisher.City == city));
答案 3 :(得分:1)
根据系统的不同,true可以是任何非零值。在其他情况下,它可以是任何正值。
其他系统不是真正的布尔值,并允许布尔值的第三个状态为null或nill,这就是为什么你可能会重载true和false,而不是重载一个bool操作符。