c# - C# 中的 Tribool 实现

标签 c# operator-overloading

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

我正在使用一个结构,因为它是一个原始类型,不应该是可扩展的。我知道有 3 种类型的 Tribool——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?
    }

但我不确定这是否正确,因为看起来我只是将一个 Tribool 设置为另一个 Tribool。我应该改用 ValueType 吗?当我在 VS 中输入时弹出,听起来很合理,但我无法从谷歌中找到很多信息。

此外,Tribool 需要能够使用常规 bool 值进行运算,这意味着需要重载“true”和“false”。这需要运算符重载吗?或者它应该只是一个返回 bool 值的方法?

提前致谢!

编辑:抱歉,我应该提到这是为了一项任务。所以我不能使用 bool 值,尽管它比你们中的许多人指出的要实用得多。

最佳答案

bool?

完成。那个做?特别是,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();
        }
    }
}

关于c# - C# 中的 Tribool 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2174989/

相关文章:

c++ - 为什么 operator= 不适用于具有新模板放置的标准类型?

c# - MVC 从另一个 MVC 应用程序渲染 (RenderPartial, RenderAction) Html

c# - 文件关闭问题窗口

c# - LINQ 和大数据库中的选择行

c++ - 在 C++ 中重载 [] 运算符

c++ - 将指向模板函数的指针作为函数参数传递?

c++ - 重载输入/输出运算符,为什么它以这种方式工作而不是另一种方式?

c# - 如何在 C# 中使用 VID 和 PID 查找 USB 大容量存储驱动器的盘符?

c# - 将文本 SQL 与 LINQ 结合使用

c++ - 如何为枚举编写只影响特定枚举类型的通用函数?