【问题标题】:Is there a difference when converting an enum to a string between Convert.ToString() vs .ToString()?在 Convert.ToString() 和 .ToString() 之间将枚举转换为字符串时有区别吗?
【发布时间】:2015-07-28 07:48:47
【问题描述】:

枚举字符串转换让我感到惊讶

如果我这样做:

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

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

如果我这样做了

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

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

【问题讨论】:

  • 你的枚举定义是什么样的? :)
  • 输出没有问题。正如你已经说过的。第一个是转换,第二个是对象的字符串表示。
  • 请写一个可编译的重现,因为当我尝试这个时,你描述的行为不会发生。在这两种情况下,它都返回 MyEnumValue 而不是整数表示。
  • @M.kazemAkhgary 不,基本上它们是相同的。请参阅reference source

标签: c# enums tostring


【解决方案1】:

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

【讨论】:

  • 请删除您的答案,因为我要删除问题。这也应该是一个评论。
  • @NikhilAgrawal 如果有非肯定答案评分,您可以删除,对吧?
  • @PatrickHofman:如果有答案,则不会删除。得分无关紧要。
  • @NikhilAgrawal 超过 20K 没关系。我只能投票删除该问题,如果它有负分,就像你一样。 (不是说我会投票,只是我可以投票)
【解决方案2】:

根据 Anton 的回答,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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-19
    • 2019-04-27
    • 2015-10-18
    • 1970-01-01
    • 2013-10-27
    • 2010-10-03
    相关资源
    最近更新 更多