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

时间:2010-04-19 21:24:11

标签: c# boolean overloading operator-keyword

我一直在阅读有关在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算子就是最有意义的。

任何人都可以给我一个在其他方面做到这一点的情况吗?

由于

4 个答案:

答案 0 :(得分:12)

正如the docs所说,重载truefalse旨在支持(可空)数据库类型(是/否,是/否,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)

我看到人们重载truefalse重载,以便在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操作符。

相关问题