C#中的Tribool实现

Mel*_*Mel 3 c# operator-overloading

我正在尝试使用http://www.boost.org/doc/libs/1_41_0/doc/html/tribool.html作为参考来实现Tribool类型.

我正在使用结构,因为它是一个原始类型,不应该是可扩展的.我知道有三种类型的Tribools --- True,False和Unknown,默认构造函数应该提供一个False Tribool.我的问题是,我将什么数据类型设置为True,False和Unknown?现在我有:

struct Tribool
{
    //True, False, and Unknown public constants
    public static readonly Tribool TRUE, FALSE, UNKNOWN;

    //Constructors
    public Tribool()
    {
        Tribool = FALSE; //use ValueType instead?
    }
Run Code Online (Sandbox Code Playgroud)

但我不确定这是否正确,因为看起来我只是将Tribool设置为另一个Tribool.我应该使用ValueType吗?当我在VS中输入时,它突然出现,听起来很明智,但我无法从谷歌那里找到很多关于它的信息.

此外,Tribool需要能够使用常规bool操作,这意味着需要重载"true"和"false".这是否需要操作员超载?或者它应该只是一个返回bool的方法?

提前致谢!

编辑:对不起,我应该提到这是一个任务.所以我不能使用bool,尽管它们更加实用,正如你们许多人所指出的那样.

Bri*_*sen 7

为什么不使用bool?哪个是可以为空的布尔值?


Mar*_*ell 7

bool?
Run Code Online (Sandbox Code Playgroud)

完成.那呢?特别是,C#编译器将为您提供"提升"运算符映射bool.可以说,虽然,它可能会稍微不仅仅是一个bool或一个枚举.

注意:不要使用ValueType,因为这实际上是一个拳击操作.

如果你不能使用bool?(即你想从头开始实现),我会把它映射到一个enum(可能是一个byte枚举,但我默认int为正常):

public struct Tribool : IEquatable<Tribool> {
    public static Tribool True { get { return new Tribool(true); } }
    public static Tribool False { get { return new Tribool(false); } }
    public static Tribool Unknown { get { return new Tribool(); } }
    enum TriboolState { Unknown = 0, True = 1, False = 2 }

    private readonly TriboolState state;
    public Tribool(bool state) {
        this.state = state ? TriboolState.True : TriboolState.False;
    }
    // default struct ctor handles unknown
    public static bool operator true(Tribool value) {
        return value.state == TriboolState.True;
    }
    public static bool operator false(Tribool value) {
        return value.state == TriboolState.False;
    }
    public static bool operator ==(Tribool x, Tribool y) {
        return x.state == y.state;
    }
    public static bool operator !=(Tribool x, Tribool y) {
        return x.state != y.state; // note: which "unknown" logic do you want?
                                   // i.e. does unknown == unknown?
    }
    public override string ToString() {
        return state.ToString();
    }
    public override bool Equals(object obj) {
        return (obj != null && obj is Tribool) ? Equals((Tribool)obj) : false;
    }
    public bool Equals(Tribool value) {
        return value == this;
    }
    public override int GetHashCode() {
        return state.GetHashCode();
    }
    public static implicit operator Tribool(bool value) {
        return new Tribool(value);
    }
    public static explicit operator bool(Tribool value) {
        switch (value.state) {
            case TriboolState.True: return true;
            case TriboolState.False: return false;
            default: throw new InvalidCastException();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)