在Convert.ToString()和. tostring()之间将enum转换为字符串有区别吗?



Enum String Conversion

如果我这样做:

(编辑:此断言有争议-只有当enum变量实例具有无效值时才为真)

Convert.ToString(MyEnum.MyEnumValue); // Returns Integer Representation

而如果我做

MyEnum.MyEnumValue.ToString(); // Returns `MyEnumValue`

为什么这种行为或我错过了什么?

我检查了应该在两种情况下运行的代码。枚举。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;
}

转换。ToString:

this.GetType().ToString();

所以,对于这两种情况,它应该以相同的方式工作。请提供您的代码。这是我这边的样本

根据Anton的回答,Convert.ToString.ToString()在enum上的行为是相同的。

我相信可能发生的事情是你给enum变量赋了一个超出枚举范围的整数值。由于枚举在内部被表示为整型,所以支持类型的范围通常比为其定义的枚举状态范围大得多。

枚举值的损坏很容易发生,例如在类型转换期间、反序列化步骤期间或使用枚举解析方法时。

因此,在系统的其余部分信任enum之前,您应该始终验证它是有效的,例如通过enum。IsDefined,但如果使用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
}

最新更新