Convert.ToString() 与 .ToString() 之间将枚举转换为字符串时有区别吗?
Is there a difference when converting an enum to a string between Convert.ToString() vs .ToString()?
枚举字符串转换让我感到惊讶
如果我这样做:
(编辑:这个断言是有争议的——只有当枚举变量实例有一个无效值时它才正确)
Convert.ToString(MyEnum.MyEnumValue); // Returns Integer Representation
而如果我这样做
MyEnum.MyEnumValue.ToString(); // Returns `MyEnumValue`
为什么会出现这种行为,还是我遗漏了什么?
我检查了两种情况下应该是 运行 的代码。
对于 Enum.ToString:
public override string ToString()
{
return Enum.InternalFormat((RuntimeType)base.GetType(), this.GetValue());
}
private static string InternalFormat(RuntimeType eT, object value)
{
if (eT.IsDefined(typeof(FlagsAttribute), false))
{
return Enum.InternalFlagsFormat(eT, value);
}
string name = Enum.GetName(eT, value);
if (name == null)
{
return value.ToString();
}
return name;
}
对于Convert.ToString:
this.GetType().ToString();
因此,对于这两种情况,它应该以相同的方式工作。请提供您的代码。
这是我这边的sample。
根据 Anton 的回答,Convert.ToString
和 .ToString()
在枚举上的行为是相同的。
我相信可能发生的情况是您为 enum
变量分配了一个超出枚举范围的整数值。由于枚举在内部表示为 integral types,支持类型的范围通常比为其定义的枚举状态范围更广。
枚举值的损坏很容易发生,例如在转换期间、反序列化步骤期间或使用 时。
因此,在系统的其余部分信任它之前,您应该始终验证枚举是否有效,例如通过 Enum.IsDefined, although you'll need to do further work if you are using FlagsAttribute
enum MyEnum
{
Value1 = 1,
Value2 = 2
};
void Main()
{
// Literal
Console.WriteLine(Convert.ToString(MyEnum.Value1)); // Value1
Console.WriteLine(MyEnum.Value1.ToString()); // Value1
// Variable
MyEnum myEnum = MyEnum.Value2;
Console.WriteLine(Convert.ToString(myEnum)); // Value2
Console.WriteLine(myEnum.ToString()); // Value2
// Invalid
MyEnum badEnum = (MyEnum)123;
Console.WriteLine(Convert.ToString(badEnum)); // 123
Console.WriteLine(badEnum.ToString()); // 123
}
枚举字符串转换让我感到惊讶
如果我这样做:
(编辑:这个断言是有争议的——只有当枚举变量实例有一个无效值时它才正确)
Convert.ToString(MyEnum.MyEnumValue); // Returns Integer Representation
而如果我这样做
MyEnum.MyEnumValue.ToString(); // Returns `MyEnumValue`
为什么会出现这种行为,还是我遗漏了什么?
我检查了两种情况下应该是 运行 的代码。 对于 Enum.ToString:
public override string ToString()
{
return Enum.InternalFormat((RuntimeType)base.GetType(), this.GetValue());
}
private static string InternalFormat(RuntimeType eT, object value)
{
if (eT.IsDefined(typeof(FlagsAttribute), false))
{
return Enum.InternalFlagsFormat(eT, value);
}
string name = Enum.GetName(eT, value);
if (name == null)
{
return value.ToString();
}
return name;
}
对于Convert.ToString:
this.GetType().ToString();
因此,对于这两种情况,它应该以相同的方式工作。请提供您的代码。 这是我这边的sample。
根据 Anton 的回答,Convert.ToString
和 .ToString()
在枚举上的行为是相同的。
我相信可能发生的情况是您为 enum
变量分配了一个超出枚举范围的整数值。由于枚举在内部表示为 integral types,支持类型的范围通常比为其定义的枚举状态范围更广。
枚举值的损坏很容易发生,例如在转换期间、反序列化步骤期间或使用
因此,在系统的其余部分信任它之前,您应该始终验证枚举是否有效,例如通过 Enum.IsDefined, although you'll need to do further work if you are using FlagsAttribute
enum MyEnum
{
Value1 = 1,
Value2 = 2
};
void Main()
{
// Literal
Console.WriteLine(Convert.ToString(MyEnum.Value1)); // Value1
Console.WriteLine(MyEnum.Value1.ToString()); // Value1
// Variable
MyEnum myEnum = MyEnum.Value2;
Console.WriteLine(Convert.ToString(myEnum)); // Value2
Console.WriteLine(myEnum.ToString()); // Value2
// Invalid
MyEnum badEnum = (MyEnum)123;
Console.WriteLine(Convert.ToString(badEnum)); // 123
Console.WriteLine(badEnum.ToString()); // 123
}