C#Enum.TryParse解析无效的数字字符串

Ido*_*ohn 12 c# enums

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")则不行.

我可以通过首先检查它是否只是一个数字字符串来轻松克服这个问题,但为什么这是行为呢?它是按设计的吗?

谢谢!我做

key*_*rdP 7

在内部,枚举存储为整数,这可能是为什么TryParse对于传入的整数返回true的原因.

关于为什么任何整数工作,它是设计的.来自MSDN(强调我的):

当此方法返回时,result包含TEnum类型的对象,如果解析操作成功,则其值由value表示.如果解析操作失败,则result包含底层类型TEnum的默认值.请注意,此值不必是TEnum枚举的成员.此参数未初始化传递.

  • 谢谢!我没有找到正确的位置..另外,显然来自MSDN:如果不希望这种行为,请调用IsDefined方法以确保整数的特定字符串表示实际上是TEnum的成员. (3认同)

Tor*_*sen 7

此方法严格解析枚举范围内的整数:

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 基础类型的默认值


ach*_*ach 5

枚举类型的变量或字段可以保存其基础类型的任何值,因此Enums在您的情况下,将12的值存储在类型变量中是完全合法的:

var e = (Enums) 12;
var i = (int) e; // i is 12
Run Code Online (Sandbox Code Playgroud)

因此,Enum.TryParse必须能够解析任何类型的值int(或枚举中使用的任何基础整数类型)。

如果要拒绝枚举中没有表示形式的值,请使用进行检查Enum.IsDefined