7

私は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);
    }

更新:1)これまでのところ、答えはすべて、intであれ文字列であれ、表現を比較しています。列挙型自体は常に私が収集する不平等ですか?平等を定義する手段はありませんか?

4

7 に答える 7

14

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

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

また、整数または文字列の表現が同じであるため、同じか等しい必要があるというステートメントに異議を唱えたいと思います。NetworkInterface2つの列挙型とが与えられVehicleTypeた場合、C#または.Net Frameworkが、列挙型と比較したときに値または文字列のいずれかでNetworkInterface.None等しくなることを許可することは論理的ではありません。VehicleType.Noneただし、開発者が強く型付けされた列挙を整数または文字列にキャストした場合、言語またはフレームワークが2つが等しくなるのを防ぐためにできることは何もありません。

さらに明確にするMyEnum.Equalsために、別の等式メソッドを提供するためにオーバーライドすることはできません。.Net列挙型は、Javaの新しいバージョンにある第一級市民ではありません。また、C#で列挙型とのより豊富な対話が可能になることを願っています。

于 2009-11-05T21:24:31.120 に答える
3

この引用は29ページの「列挙型」セクションから抽出されたC#言語仕様v3.0を参照してください。

「各列挙型には、列挙型の基になる型と呼ばれる対応する整数型があります。基になる型を明示的に宣言しない列挙型には、intの基になる型があります。列挙型の格納形式と可能な値の範囲は、基になる型:enum型がとることができる値のセットは、そのenumメンバーによって制限されません。特に、enumの基になる型の任意の値は、enum型にキャストでき、そのenumの明確な有効な値です。タイプ。"

.AreEqualメソッドは実際に同等性をテストし、2番目のメソッドはIDをテストします。したがって、それぞれを基になる型(この場合はint)にキャストしてから、比較を行います。

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);
}
于 2009-11-05T21:32:39.543 に答える
2

Javaとは異なり、C#はメソッド(operator ==()など)を列挙型に追加するための機能を提供していません。

よりスマートな列挙型が必要なときに私が過去に行ったことは、XHelperクラス(X列挙型の名前はどこですか)を作成することであり、すべてのメソッドをその上に配置します。したがって、次のようなものです。

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

ただし、同じことを表すために2つの異なる列挙型が必要な場合に遭遇したことは覚えていません。

于 2009-11-05T22:23:05.737 に答える
1

それらを一致させたい場合は、それらをintにキャストします

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

両方とも最初にリストされているため、合格します。両方とも「1つ」と言っているために一致させたい場合は、リフレクションを使用する必要があります。

于 2009-11-05T21:24:17.157 に答える
1

正直なところ、平等はほとんどの場合簡単ではありません。

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

于 2009-11-05T21:29:31.233 に答える
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); 
    }
于 2009-11-05T21:24:15.923 に答える
0

あなたはそれらをキャストしてみることができます:

Assert.AreEqual((int)enumA.one, (int)enumB.one);
于 2009-11-05T21:24:30.387 に答える