埃努姆<T>。解析允许解析任何整数字符串。这是 .net 核心中的错误吗?



如果我们尝试用字符串整数("2""3""55",...(调用Enum.Parse<T>,即使枚举没有定义解析的值,解析也会成功。

下面是示例代码

public static class Program
{
enum TestEnum
{
A = 0,
B = 1,
C = 2
}
public static void Main(string[] args)
{
TestEnum value = Enum.Parse<TestEnum>("4");
Console.WriteLine(value); // outputs 4 to console
bool result = Enum.TryParse<TestEnum>("4", out _);
Console.WriteLine(result); // writes True 
bool isDefined = Enum.IsDefined(typeof(TestEnum), "4");
Console.WriteLine(isDefined); // writes False
}
}

在我看来,这种行为是出乎意料的。我们在应用程序中发现了一个错误,因为我们使用了Enum.TryParse而不是Enum.IsDefined

.net 核心版本:

>dotnet --list-sdks
2.2.110 [C:Program Filesdotnetsdk]
2.2.207 [C:Program Filesdotnetsdk]
3.1.101 [C:Program Filesdotnetsdk]

此输出来自使用 VS2017 在调试模式下运行的控制台(这意味着应用程序可能在 2.2.110 运行时下运行(。

这是 .net 核心中的错误吗?我试图在.net核心github存储库上找到错误报告,但没有运气。

从文档中:

如果value是不表示TEnum枚举的基础值的整数的字符串表示形式,则该方法返回其基础值value转换为整型类型的枚举成员。如果不希望此行为,请调用IsDefined方法以确保整数的特定字符串表示形式实际上是TEnum的成员。

所以这不是一个错误,它是有意和记录的行为。

最新更新