将枚举转换为Convert.ToString()与.ToString()之间的字符串有什么区别吗?

时间:2015-07-28 07:48:47

标签: c# enums tostring

Enum String Conversion让我感到惊讶

如果我这样做:

(编辑:这个断言是有争议的 - 只有当枚举变量实例的值无效时才会有效)

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

然而,如果我这样做

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

为什么会出现这种行为,或者我错过了什么?

2 个答案:

答案 0 :(得分:2)

我检查了应该针对这两种情况运行的代码。 对于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在我身边。

答案 1 :(得分:0)

根据安东的回答,Convert.ToString.ToString()在枚举上的行为是相同的。

我相信可能发生的事情是您为enum变量分配了一个超出枚举范围的整数值。由于枚举在内部表示为integral types,因此支持类型通常具有比为其定义的枚举状态更宽的范围。

枚举值的损坏可以非常容易地发生,例如在转换期间,反序列化步骤期间或使用enum parsing methods时。

因此,在信任系统的其余部分之前,您应始终验证枚举是否有效,例如:通过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
}
相关问题