考虑以下
public enum E
{
A = 1,
B = 1
}
public string F(E input)
{
return input.ToString();
}
F(E.B); //returns "A"
现在我知道您不应该((E)1).ToString()
,因为它可以解析为A
或B
(http://msdn.microsoft.com/en-us/library/16c1xs4z.aspx)。
但是,如果它是明确选择的值(例如B
),为什么ToString()
表现得很糟糕(返回A
)?
调试可能会发现input
为B
时,是否可以在代码中获取所选字段?
修改
这个问题与调试器如何知道哪个值传递给F()
有关,而在代码中似乎无法检测到这个值?
答案 0 :(得分:2)
枚举实际上只是一个整数值。当您拨打input.ToString()
时,枚举会执行以下操作:
1
[Flags]
进行修饰)当找到匹配的名称时,它会找到值为1的第一个匹配项,在本例中为E.A
,并打印“A”。
通常,这不是问题,因为通常每个名称只有一个枚举值。
当调试它可能看到输入是B时,是否可以在代码中获取所选字段?
问题是input
不是“B” - 输入值为1包含在E
变量中,这意味着输入为E.A
和< / strong> 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.A
和E.B
。
如果您暂停Console.ReadKey
,调试器也会将value
显示为“A”。
答案 1 :(得分:0)
问题是两个可能的枚举值A
和B
都有1
的整数值,因此无法区分A
和{ {1}}因为C#只是将B
的值作为参数传递给方法。