読者です 読者をやめる 読者になる 読者になる

雑記 - otherwise

最近はDQ10しかやっていないダメ技術者がちまちまと綴る雑記帳

Enum を二値で扱う

C#

気持ちは判らないでもないのですが、 Enum って「列挙」体だからなぁ。。。
要は、 Enum演算子をオーバーロード出来れば話は早い( C# が否定演算子 (!) のオーバーロードをサポートしている)のだけれども、残念ながら C# 言語仕様がそれを許してくれない、と。。。
なので、代わりに struct を使ってみました。

struct ProcResult {
  public static ProcResult Success { get { return new ProcResult() { Status = true }; } }
  public static ProcResult Failure { get { return new ProcResult() { Status = false }; } }
  public bool Status { get; set; }

  public static ProcResult operator ! (ProcResult procResult) {
    if (procResult == ProcResult.Success) {
      return ProcResult.Failure;
    }
    return ProcResult.Success;
  }

  public override bool Equals(object p) {
    if (!(p is ProcResult)) {
      return false;
    }
    return (this.Status == ((ProcResult)p).Status);
  }

  public override int GetHashCode() {
    return base.GetHashCode();
  }

  public override string ToString() {
    return this.Status.ToString();
  }

  public static bool operator == (ProcResult p1, ProcResult p2) {
    return (p1.Status == p2.Status);
  }

  public static bool operator != (ProcResult p1, ProcResult p2) {
    return (p1.Status != p2.Status);
  }

  public static implicit operator bool(ProcResult p) {
    return p.Status;
  }

  public static implicit operator ProcResult (bool b) {
    return new ProcResult() { Status = b };
  }
}

class Program {
  static void Main(string[] args) {
    ProcResult v = ProcResult.Success;
    v = !v;
    Console.WriteLine(v);
  }
}

面倒なので GetHashCode() は実装をサボりました。(どう実装すべきなのかよく判っていないだけとも云う) :p
一応、上記コードが通る事は確認しましたが、実用に耐え得るかは知りません。 ^^;;