1

考虑以下

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

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

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

现在我知道你不应该这样做((E)1).ToString(),因为它可以解决ABhttp://msdn.microsoft.com/en-us/library/16c1xs4z.aspx)。
但是当它是一个明确选择的值(例如B)时,为什么会ToString()表现得很奇怪(返回A)?

调试时可能会看到,input是否B可以在代码中获取所选字段?

编辑
这个问题与调试器如何知道传递给哪个值有关F(),而在代码中似乎无法检测到这一点?

4

2 回答 2

2

枚举实际上只是一个整数值。发生的情况是,当您调用 时input.ToString(),枚举会执行以下操作:

  • 获取输入的值,在这种情况下,1
  • 将此传递给内部格式化例程,该例程会找到匹配的名称(如果没有用 装饰[Flags]
  • 返回名称

当它去查找匹配的名称时,它会找到一个值为 1 的匹配项,在本例中为E.A,并打印“A”。

通常,这不是问题,因为每个名称通常只有一个枚举值。

调试时可能看到输入是 B,是否可以在代码中获取所选字段?

问题是input不是“B” - 输入是 1 包装在E变量中的值,这意味着输入是E.A and 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两次,value和.E.AE.B

如果你 break on Console.ReadKey,调试器也将显示value为“A”。

于 2012-08-07T18:18:41.293 回答
0

问题在于两个可能的枚举值AB都有一个整数值1,因此无法区分AB因为 C# 只是将值1作为参数传递给方法。

于 2012-08-07T18:19:43.130 回答