1

次のことを考慮してください

public enum E
{
  A = 1,
  B = 1  
}

public string F(E input)
{
 return input.ToString();
}

F(E.B); //returns "A"

または(http://msdn.microsoft.com/en-us/library/16c1xs4z.aspx((E)1).ToString()に解決される可能性があるため、実行する必要がないことがわかりました。 しかし、それが明示的に選択された値(たとえば)である場合、なぜ奇妙に振る舞う(戻る)のでしょうか?AB
BToString()A

inputそれが可能であることを確認するためにデバッグするときB、選択したフィールドをコードで取得することは可能ですか?

編集
この質問は、デバッガーがどの値が渡されるかを知る方法に関連していますがF()、コードではこれを検出することはできないようです?

4

2 に答える 2

2

列挙型は実際には単なる整数値です。何が起こるかというと、を呼び出すinput.ToString()と、列挙型は次のことを行います。

  • 入力の値を取得します。この場合は、1
  • これを内部フォーマットルーチンに渡し、一致する名前を見つけます(これがで装飾されていない場合[Flags]
  • 名前を返します

一致する名前を検索するときに、値が1の最初のE.A一致(この場合は、)を検索し、 「A」を出力します。

通常、これは問題ではありません。通常、名前ごとに1つの列挙値しかないためです。

入力がBであることを確認する可能性をデバッグするとき、選択したフィールドをコードで取得することは可能ですか?

問題は、それinputが「B」ではないことです。E入力は変数にラップされた値1です。つまり、入力はとE.A です E.B

デモンストレーションするには、次を実行します。

using System;
class Program
{
    public enum E
    {
        A = 1,
        B = 1
    }

    static void Main(string[] args)
    {
        E value = E.B;


        Console.WriteLine(value == E.B);
        Console.WriteLine(value == E.A);

        Console.ReadKey();
    }

}

との両方とTrue同様に、これは2回印刷されます。valueE.AE.B

を中断するConsole.ReadKeyと、デバッガーにvalueも「A」と表示されます。

于 2012-08-07T18:18:41.293 に答える
0

問題は、2つの可能な列挙値AB両方がの整数値を持っていることです。C#は引数としての値をメソッドに渡すだけなので、とを1区別することはできません。AB1

于 2012-08-07T18:19:43.130 に答える