C# C语言中数字字符串到枚举的转换#

C# C语言中数字字符串到枚举的转换#,c#,enums,C#,Enums,最近我发现,任何只包含数字字符的字符串都可以在C#中转换为enum。例如,假设有一个枚举定义如下: public enum TestEnum { One = 1, Two = 2, Three = 3 }; 我可以将一些随机数字字符串转换为TestEnum TestEnum testEnum = (TestEnum)Enum.Parse(typeof(TestEnum), "4"); Console.WriteLine(testEnum); 值“4”当然不会映射到已定

最近我发现,任何只包含数字字符的字符串都可以在C#中转换为enum。例如,假设有一个枚举定义如下:

public enum TestEnum
{
    One = 1,
    Two = 2,
    Three = 3
};
我可以将一些随机数字字符串转换为
TestEnum

TestEnum testEnum = (TestEnum)Enum.Parse(typeof(TestEnum), "4");
Console.WriteLine(testEnum);
值“4”当然不会映射到已定义的
TestEnum
值之一,输出将只是
4
,但是不会有错误,因此此转换是合法的

另一方面,如果我尝试检查
TestEnum
中是否定义了此值:

Console.WriteLine(Enum.IsDefined(typeof(TestEnum), "4"));
我将在输出中收到
False

考虑到以下非数字字符串的转换,这对我来说似乎有点奇怪

(TestEnum)Enum.Parse(typeof(TestEnum), "Test")
将抛出
System.ArgumentException

我对这种行为感到困惑。这是故意设计的还是巧合

这是故意设计的还是巧合

我不确定我是否理解你的问题。我似乎完全清楚:

将一个或多个枚举常量的名称或数值的字符串表示形式转换为等效的枚举对象

(强调矿山)

它还说:

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

显然,这是故意的行为,而不仅仅是巧合

请注意,您始终可以将
enum
的基础类型的任何值(在本例中为
int
)强制转换为
enum
类型本身。
enum
类型功能不强制执行
enum
的值与命名值相对应。因此解析行为与
enum
类型的编译时行为完全一致


我想人们可能会争论
enum
类型是否应该允许使用未命名的值。但是,鉴于
enum
类型的特征之一是允许基于标志的枚举,无论它们是否具有
[Flags]
属性,并且鉴于必须命名
enum
类型中定义的每个标志的每个组合都会很不方便(至少可以这么说),似乎有道理,他们会继续为所有类型的
enum
类型允许未命名的值。

枚举是一种隐藏的数字类型(除非另有明确声明,否则为
int
)。因此,它可以保存特定数值类型的值范围内的任何值。考虑到这一点,您描述的行为并不奇怪,即使有一个枚举变量包含的值不是定义的命名值之一也可能会有点混淆。(这种行为在这里被解释/记录:)我觉得这种记录完全错误,因为它说的是“一个或多个枚举常量的数值”,并且没有这样的限制(正如OP所发现的)@Ben:如果你愿意,你可以对摘要的措辞进行质疑。然而,文件中也明确指出如果value是整数的字符串表示形式,而该整数不表示enumType枚举的基础值,则该方法返回一个枚举成员,其基础值是转换为整数类型的值。如果不需要此行为,请调用IsDefined方法以确保整数的特定字符串表示形式实际上是enumType的成员“