考虑以下示例,我尝试覆盖枚举值,以便能够使用大写字母解析枚举:
public enum Language
{
Heb,
Eng,
heb = Heb,
eng = Eng
}
class Program
{
static void Main(string[] args)
{
var e = "heb";
Language result;
Enum.TryParse(e, out result);
Console.WriteLine(result);
Console.WriteLine(result.ToString());
}
}
此示例返回:“Heb”“Heb”
另一方面,这个例子:
public enum Language
{
Heb,
Eng,
heb = Heb,
eng = Eng,
None
}
class Program
{
static void Main(string[] args)
{
var e = "heb";
Language result;
Enum.TryParse(e, out result);
Console.WriteLine(result);
Console.WriteLine(result.ToString());
}
}
返回“heb”“heb”
任何想法为什么?
答案 0 :(得分:6)
当两个枚举值具有相同的表示形式时,Enum.ToString
无法保证使用哪个枚举值。您可以将测试缩短到Console.WriteLine(Language.Heb);
。由于Heb
和heb
都是有效输出,因此无法保证您获得哪一项。引自Enum.ToString:
来电者须知
如果多个枚举成员具有相同的基础值,并且您尝试根据其基础值检索枚举成员名称的字符串表示形式,则您的代码不应对该方法将返回的名称做出任何假设。例如,以下枚举定义了两个具有相同基础值的成员Shade.Gray和Shade.Grey。
enum Shade { White = 0, Gray = 1, Grey = 1, Black = 2 }
以下方法调用尝试检索其底层值为1的Shade枚举成员的名称。该方法可以返回“Gray”或“Gray”,并且您的代码不应该对哪个字符串将做出任何假设被退回。
string shadeName = ((Shade) 1).ToString("F");