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

Joe*_*nos 18 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);
}
Run Code Online (Sandbox Code Playgroud)

对我来说,这与说:

public static implicit operator bool(Foo foo) {
  return (foo.PropA > 0);
}
Run Code Online (Sandbox Code Playgroud)

据我所知,区别在于,通过分别定义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; }
Run Code Online (Sandbox Code Playgroud)

我确信这是允许的原因,但我想不出它是什么.对我而言,如果您希望将对象转换为true或false,则单个bool运算符最有意义.

任何人都可以给我一个场景,以另一种方式做到这一点吗?

谢谢

Hen*_*man 12

正如文档所说,重载true并且false旨在支持(可空)数据库类型(是/否,Y/N,0/1等).

当然,与任何操作员一样,您可以不一致地定义它们.返回合理的东西是你的责任.编译器只是要求两者都没有.


Dan*_*ant 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

所以现在我们知道这个经典悖论的真正解决方案...... StackOverflowException.