Enum を二値で扱う
- Enumを二値扱いたかったりする。 (HIRASE CONNECTION WK)
気持ちは判らないでもないのですが、 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
一応、上記コードが通る事は確認しましたが、実用に耐え得るかは知りません。 ^^;;