2009-11-05 13 views
7

私は2つの列挙型を作成していると私は、彼らが同じではありませんが、それでも私はそれが彼らの文字列表現だけでなく、その数字の表現が同じ(とさえ同じであるため、彼らは等しいだろう理にかなっていると思います知っています... )。C#で2つの列挙型が等しいのはいつですか?

つまり、最初のテストに合格し、2番目のテストに失敗します。しかし、実際にはどちらも失敗します。それでは、C#の2つの列挙型はいつ等しいのですか?または、とにかくC#でequals演算子を定義することはありますか?

ありがとうございます!

public enum enumA {one, two} 

    public enum enumB {one, two} 

    [Test] 
    public void PreTest() 
    {   
    Assert.AreEqual(enumA.one,enumB.one); 
    Assert.AreSame(enumA.one, enumB.one); 
    } 

UPDATEは:1)だから、答えは、これまでのすべての表現を比較し、それがint型や文字列です。 enum 自体ははいつも私は不平等ですか?それに対して平等を定義する手段はありませんか?

+0

重複:http://stackoverflow.com/questions/1410131/comparing-two-enum-types-for-equivalence –

+0

@Robert:興味深いリンクに感謝します。明らかに重複しない:列挙型の値を求めます。 – Peter

答えて

14

列挙型が強く、したがってenumA.one != enumB.one、C#で型付けされています。ここで、各列挙型を整数値に変換すると、それらは等しくなります。

Assert.AreEqual((int)enumA.one, (int)enumB.one); 

また、私は、彼らが同じであるか、または等しい必要があることを同じ整数や文字列表現を持っているので、という声明に挑戦したいと思います。 NetworkInterfaceVehicleTypeという2つの列挙型を指定すると、C#または.Net FrameworkでVehicleType.Noneと等しい値にすることはできません。値または文字列で列挙された列と比較されます。しかし、開発者が強く型付けされた列挙体を整数または文字列にキャストした場合、言語またはフレームワークがequalsから2つを等価にすることはできません。

異なる平等法を提供するために、さらに明確にするために、MyEnum.Equalsを無効にすることはできません。 .Netの列挙型は、Javaのそれ以降のバージョンにあるファーストクラスの市民ではありません.C#では列挙型との豊富な相互作用が可能であることを願っています。

+1

ここで注意してください。これは、順序の位置が同じ場合にのみ当てはまります。 –

+1

ありがとうございます。しかし、!=演算子は、私が後にしているものではなく、むしろequals()です。強く型付けされた型も、私が思っていたものと同じであっても、そうでないものであっても構いません。 – Peter

+0

@Peter:列挙型は構造体です。さらに、それらのメソッドのいずれもオーバーロードできません。また、私は実際のコードスニペットより動詞のほうが多い! @Tim:確かに、これは彼の場合と彼の場合のみです。 – user7116

0
public enum enumA {one = 1, two = 2} 

    public enum enumB {one = 1, two = 2} 

    [Test] 
    public void PreTest() 
    {      
     Assert.AreEqual((int)enumA.one, (int)enumB.one); 
     // I don't think this one will ever pass 
     Assert.AreSame(enumA.one, enumB.one); 
    } 
1

あなたがそれらを一致させたい場合は、彼らは両方とも記載されている最初のものであるので、

Assert.AreEqual((int)enumA.one,(int)enumB.one); 

が通過するintにそれらをキャスト。両方が「1」と言われて一致させたい場合は、リフレクションを使用する必要があります。

+2

私は、これを行うことができます、文字列の値を確認する:Assert.AreEqual(enumA.one.ToString()、enumB.one.ToString()); – Jonas

+0

またはもちろん文字列にキャストします。 – Peter

0

あなたはそれらをキャストしてみてください:

Assert.AreEqual((int)enumA.one, (int)enumB.one); 
1

正直言って、平等はほとんどの場合、まっすぐではありません。

私は、IEqualityComparer(および他の等価性テスト、IsSame()など)を実装するヘルパークラスを作成し、それを使用する傾向があります。

3

私はこの引用は、29ページのEnumセクションから抽出されたC#言語仕様バージョン3.0、にあなたを参照してください。

「各列挙型がの基になる型と呼ばれ、対応する整数型を持っています列挙型の格納形式と可能な値の範囲は、基になる型によって決まります。列挙型の取りうる値のセットは、次のとおりです。その列挙型の型に限定されず、特に列挙型の基礎となる型の値は列挙型にキャストでき、その列挙型の明確な有効な値です。「

.AreEqual方法が本当に単純な比較を行う、その基になる型(この場合は、int型)に各1をキャストして、それで。第二のテストアイデンティティながら、等価性をテストしている。

public enum enumA { one, two } 
public enum enumB { one, two } 
[Test] 
public void PreTest() 
{ 
     Assert.AreEqual((int)enumA.one,(int)enumB.one); 
     Assert.AreSame(enumA.one, enumB.one); 
} 
+0

Tx、リンクを提供できますか? – Peter

2

とは異なり、 JavaのC#では、演算子==()などのメソッドを列挙型に追加する機能は提供されていません。

スマートな列挙型を必要とするときに私が行ったことは、XHelperクラス(X)列挙型の)、私はそれの上にすべてのメソッドを置く:このような何か:

public static bool EnumAHelper.EqualsEnumB(EnumA enumA, EnumB enumB) 
{ 
    return (int)enumA == (int)enumB; 
} 

同じことを示すために2つの異なる列挙型が必要なケースを思い出しませんが、

+0

非常に良い発言(しかし後)。私は互換性があるように既存のクラスを書き直しているので、enumも同じでなければなりません。 – Peter

関連する問題