C#.NET 4.5,Windows 10,我有以下枚举:
private enum Enums
{
A=1, B=2, C=3
}
Run Code Online (Sandbox Code Playgroud)
而且这个程序表现得非常奇怪:
public static void Main()
{
Enums e;
if (Enum.TryParse("12", out e))
{
Console.WriteLine("Parsed {0}", e);
}
else
{
Console.Write("Not parsed");
}
Console.ReadLine();
}
Run Code Online (Sandbox Code Playgroud)
我希望TryParse方法的结果是假的,但令我惊讶的是控制台显示"Parsed 12".在Watch窗口中,它甚至显示值为"12"并且它是Enums类型!
对于我尝试过的任何数字字符串(例如"540")都是如此,但对于包含字母的字符串("A12","12A")则不行.
我可以通过首先检查它是否只是一个数字字符串来轻松克服这个问题,但为什么这是行为呢?它是按设计的吗?
谢谢!我做
此方法严格解析枚举范围内的整数:
public static bool EnumTryParseStrict<TEnum>(string value, out TEnum result, bool ignoreCase = false) where TEnum : struct, Enum {
if (Enum.TryParse(value, ignoreCase, out result) && Enum.IsDefined(typeof(TEnum), result)) {
return true;
}
result = default;
return false;
}
Run Code Online (Sandbox Code Playgroud)
该方法可以放置在静态类中,如下所示:
namespace IdentityStream {
public static class EnumUtil {
public static bool TryParseStrict<TEnum> ...
}
}
Run Code Online (Sandbox Code Playgroud)
结果=默认值;当解析操作失败时,分配 TEnum 基础类型的默认值。这样做是为了符合 Enum.TryParse 合约设定的期望:
如果解析操作失败,结果将包含 TEnum 基础类型的默认值
枚举类型的变量或字段可以保存其基础类型的任何值,因此Enums在您的情况下,将12的值存储在类型变量中是完全合法的:
var e = (Enums) 12;
var i = (int) e; // i is 12
Run Code Online (Sandbox Code Playgroud)
因此,Enum.TryParse必须能够解析任何类型的值int(或枚举中使用的任何基础整数类型)。
如果要拒绝枚举中没有表示形式的值,请使用进行检查Enum.IsDefined。
| 归档时间: |
|
| 查看次数: |
1739 次 |
| 最近记录: |