代码之家  ›  专栏  ›  技术社区  ›  Joe Enos

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

  •  17
  • Joe Enos  · 技术社区  · 16 年前

    我读过关于在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,可以得到一个既为true又为false,或者既为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 回复  |  直到 16 年前
        1
  •  12
  •   Henk Holterman    16 年前

    the docs true 和 false

    当然,你可以不一致地定义它们,就像任何操作符一样。归还一些合理的东西是你的责任。编译器只需要两者都不需要或两者都不需要。

        2
  •  8
  •   Dan Bryant    16 年前

    我不知道这些操作员的存在。这意味着你可以实现自我否定悖论:

    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;
        }
    }
    

    所以现在我们知道了这个经典悖论的真正解决方法。。。堆栈溢出异常。

        3
  •  2
  •   Fábio Batista Raza Ahmed    16 年前

    true false 重载来做一些聪明的事情,比如在.NET2.0中,在Linq出现之前构建表达式。

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

    return Repository.FindAll(
        (Where.Publisher.Name == name) &&
        (Where.Publisher.City == city));
    
        4
  •  1
  •   Benjamin Anderson    16 年前

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