【问题标题】:Enum ToString appears as a numberEnum ToString 显示为数字
【发布时间】:2013-02-27 12:28:51
【问题描述】:

我有一个枚举

private enum TimeUnit
{      
  Day,
  Month,
  Year
}

我正在用以下内容填充描述:

return string.Concat(unit, "(s)");

其中 unit 是 TimeUnit。大多数情况下,这可以正常工作并显示“Days(s)”,但在特定服务器上显示为“1(s)”

这是什么原因造成的?

【问题讨论】:

  • 我的猜测是运行不同版本的.Net?您只需添加 unit.ToString() 即可解决
  • 我很想知道是什么让这个显示与众不同。如果是 .NET 版本,何时更改,为什么?
  • @Marthin 我相信你可能是正确的 .NET 版本(我不想把我的答案放在问题中)但是 string.Concat 应该导致一个隐式 ToString( ) 所以我'我怀疑简单地添加它会改变而不提供格式信息。
  • @Marthin - 不确定它会改变什么,因为 string.Concat 已经做了 ToString()。
  • @Liath - 问题真的出在 1 上吗?还是可以是另一个数字?因为相同枚举类型的不同版本可能会导致这种情况。例如,如果有一天您添加了第 4 个值并且不部署相应的 dll,您将看到未部署新 dll 的位置显示“3(s)”。

标签: c# enums tostring


【解决方案1】:

尝试使用Enum.GetName()

它还具有safer 的优势,因为它需要:

  • 您传入的值不为空。
  • 您传入的值是枚举可以实际用作其基础类型的类型,或者是枚举本身的类型。它在值上使用 GetType 来检查这一点。

【讨论】:

  • enums 不能为空,这在很大程度上是精神分裂症的安全。
  • 我已经提交了这个修复 - 显然我必须等待部署到服务器才能知道它是否正确!
  • 当我们把它放到服务器上时修复工作 - 相信这是一个 .NET 版本问题
【解决方案2】:

您应该使用ToString 正确格式化:

return string.Concat(unit.ToString("F"), "(s)");

【讨论】:

    【解决方案3】:

    因为Enum 是数字枚举选项,只用字符串表示(认为它们是别名)

    【讨论】:

    • 是的,但这并不能解释为什么两个不同的盒子应该以不同的方式执行 ToString 操作。
    【解决方案4】:

    MSDN 说:

    此方法的工作原理就像通用格式字符“G”是 指定的。也就是说,如果 FlagsAttribute 没有应用到这个 枚举类型,并且有一个命名常量等于 这个实例,那么返回值是一个包含名字的字符串 的常数。如果应用了 FlagsAttribute 并且存在 一个或多个命名常量的组合等于 this 的值 实例,则返回值是一个包含 定界符分隔的常量名称列表。否则,该 返回值是this的数值的字符串表示 实例。

    所以理想情况下,它应该可以正常工作(考虑到未应用 FlagsAttribute 并且有一个与此实例的值相等的命名常量)。你能说说这两个盒子之间的区别吗?

    另外,请尝试给出明确的数字。

    private enum TimeUnit
    {      
      Day = 1,
      Month = 2,
      Year = 3
    }
    

    【讨论】:

    • 给出显式值不会有任何影响。
    • @Groo,我同意。但是,根据 MSDN 的描述,似乎他遇到了第 3 种情况(否则,返回值是此实例的数值的字符串表示形式)。因此,也许 unit 变量的值超出了枚举范围(尽管按照1(s) 的值应该在范围内)。信息有限,只能靠猜测。
    猜你喜欢
    • 1970-01-01
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多