2010-02-01 29 views
3

我試圖使用http://www.boost.org/doc/libs/1_41_0/doc/html/tribool.html作爲參考來實現Tribool類型。C#中的Tribool實現#

我正在使用一個結構,因爲它是一個原始類型,不應該是可擴展的。我知道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中輸入時彈出,這聽起來很合理,但我無法從Google上找到很多關於它的信息。

此外,Tribool需要能夠使用常規布爾,這意味着「真」和「假」需要超載。這是否需要操作員超載?或者它應該只是一個返回布爾值的方法?

在此先感謝!

編輯:對不起,我應該提到這是一個任務。所以我不能使用bools,儘管你們許多人已經指出了它更實用。

回答

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

爲什麼不使用bool?這是一個可爲空的布爾值?