C#.NET 4.5,Windows 10,我有以下枚举:
private enum Enums
{
A=1, B=2, C=3
}
这个程序表现得非常奇怪:
public static void Main()
{
Enums e;
if (Enum.TryParse("12", out e))
{
Console.WriteLine("Parsed {0}", e);
}
else
{
Console.Write("Not parsed");
}
Console.ReadLine();
}
我希望TryParse方法的结果是假的,但令我惊讶的是 控制台显示"解析12"。 在Watch窗口中,它甚至显示值为" 12"它是Enums类型的!
对于我尝试过的任何数字字符串都是如此(例如" 540"),但不适用于包含字母的字符串(" A12"," 12A" )。
我可以通过首先检查它是否只是一个数字字符串来轻松解决这个问题,但为什么这是行为呢? 这是设计吗?
谢谢! IDO
答案 0 :(得分:6)
在内部,枚举存储为整数,这可能是为什么TryParse为传入的整数返回true的原因。
关于为什么任何整数正在工作,它是设计的。来自MSDN(强调我的):
当此方法返回时,result包含TEnum类型的对象 如果解析操作成功,则其值由值表示。 如果解析操作失败,则result包含默认值 基础类型的TEnum。 请注意,此值不必是其成员 TEnum枚举。此参数未初始化传递。
答案 1 :(得分:5)
枚举类型的变量或字段可以包含其基础类型的任何值,因此在您的案例中将值12存储在Enums
类型的变量中是完全合法的:
var e = (Enums) 12;
var i = (int) e; // i is 12
因此,Enum.TryParse
必须能够解析int
类型的任何值(或枚举中使用的任何基础整数类型)。
如果您要拒绝枚举中没有任何代表的值,请使用Enum.IsDefined
进行检查。
答案 2 :(得分:2)
此方法严格将整数解析为枚举范围:
public static bool EnumTryParseStrict<TEnum>(string val, out TEnum enumVal, bool ignoreCase = false) where TEnum : struct {
return Enum.TryParse(val, ignoreCase, out enumVal) && Enum.IsDefined(typeof(TEnum), enumVal);
}