2010-02-01 2 views
3

참조로 http://www.boost.org/doc/libs/1_41_0/doc/html/tribool.html을 사용하여 Tribool 유형을 구현하려고합니다.Tribool C# 구현

기본 형식이므로 구조체를 사용하고 확장 할 수 없습니다. True, False 및 Unknown의 3 가지 유형의 Tribools가 있으며 기본 생성자는 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은 "true"및 "false"가 오버로드되어야 함을 의미하는 일반 bool로 작동 할 수 있어야합니다. 이 작업자 과부하가 필요합니까? 아니면 그냥 bool을 반환하는 방법이어야합니까?

미리 감사드립니다.

편집 : 죄송합니다. 과제에 대한 언급이 있어야합니다. 그래서 많은 사람들이 지적한 것처럼 훨씬 더 실용적이라 할지라도 나는 bool을 사용할 수 없습니다.

답변

7
bool? 

완료. 그거야? 특히 C# 컴파일러는 bool에 매핑 할 "해제 된"연산자를 제공합니다. 아마, 다소 일 수도 있고, 단지 하나의 enum이 아닌 bool 일 수도 있습니다.

참고 : 실제로는 복싱 작업이므로 ValueType을 사용하지 마십시오.

당신이 (당신이 처음부터 구현하고 싶었 IE) 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

nullable 부울 인 bool?을 사용하지 않는 이유는 무엇입니까?

2

Nullable<bool>의 무엇이 잘못 되었나요?