19

我一直在阅读有关在 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);
}

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

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 运算符最有意义。

谁能给我一个以另一种方式做有意义的场景?

谢谢

4

4 回答 4

12

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

当然,您可以对它们进行不一致的定义,就像任何运算符一样。归还合理的东西是您的责任。编译器只要求两者都不要求或两者都要求。

于 2010-04-19T21:42:23.953 回答
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。

于 2010-04-20T01:53:33.883 回答
2

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

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

return Repository.FindAll(
    (Where.Publisher.Name == name) &&
    (Where.Publisher.City == city));
于 2010-04-19T21:58:56.473 回答
1

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

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

于 2010-04-19T21:29:11.623 回答