Enum.ToString可以支持像"X2"这样的精度说明符吗?

Mar*_*wie -3 c# enums tostring

Enum.ToString(string)不支持直接使用精度说明符X2D5将填充应用于数值. 格式类似ToString("X")ToString("D")已实现且记录良好.当然,我可以明确地将其转换为int之前,因此使用为int实现的格式说明符将其转换为填充字符串.

我想知道是否有一些直接支持enum的这个功能,而不需要强制转换它们.乍一看似乎很奇怪,这不是直接实现的,因为它是为int或其他数字类型完成的.但也许我错过了一些更重要的东西,这些东西可以明确地解释说它没有像枚举那样完成?

public enum Number
{
    Ten = 10
}

Console.WriteLine(Number.Ten);                      //OK: Ten
Console.WriteLine(Number.Ten.ToString());           //OK: Ten
Console.WriteLine(Number.Ten.ToString("D"));        //OK: 10
Console.WriteLine(Number.Ten.ToString("D5"));       //Expected 00010 - Failed: System.FormatException, can only be "G","g","X","x","F","f","D" or 
Console.WriteLine(Number.Ten.ToString("X"));        //OK: 0000000A
Console.WriteLine(Number.Ten.ToString("X2"));       //Expected 0A - Failed: System.FormatException, can only be "G","g","X","x","F","f","D" or "d"
Console.WriteLine(10.ToString("X2"));               //OK: 0A
Console.WriteLine(10.ToString("D5"));               //OK: 00010
Console.WriteLine(((int)Number.Ten).ToString("X2"));//OK: 0A 
Run Code Online (Sandbox Code Playgroud)

接受答案的简短摘要:它没有明确表示,因为根据基础类型的大小,它已经被隐含地完成了.因此,如果你喜欢X2而不是X8只使用字节作为基础类型,ToString("X")并将表现得像ToString("X2").

小智 5

也许因为enum可以是byte,sbyte,short,ushort,int,uint,long或ulong.

如果你检查.net源代码,你会看到ToString("X")的实现:

switch (Convert.GetTypeCode(value))
  {
    case TypeCode.Boolean:
      return Convert.ToByte((bool) value).ToString("X2", (IFormatProvider) null);
    case TypeCode.Char:
      return ((ushort) (char) value).ToString("X4", (IFormatProvider) null);
    case TypeCode.SByte:
      return ((byte) (sbyte) value).ToString("X2", (IFormatProvider) null);
    case TypeCode.Byte:
      return ((byte) value).ToString("X2", (IFormatProvider) null);
    case TypeCode.Int16:
      return ((ushort) (short) value).ToString("X4", (IFormatProvider) null);
    case TypeCode.UInt16:
      return ((ushort) value).ToString("X4", (IFormatProvider) null);
    case TypeCode.Int32:
      return ((uint) (int) value).ToString("X8", (IFormatProvider) null);
    case TypeCode.UInt32:
      return ((uint) value).ToString("X8", (IFormatProvider) null);
    case TypeCode.Int64:
      return ((ulong) (long) value).ToString("X16", (IFormatProvider) null);
    case TypeCode.UInt64:
      return ((ulong) value).ToString("X16", (IFormatProvider) null);
    default:
      throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_UnknownEnumType"));
  }
Run Code Online (Sandbox Code Playgroud)

如果您将代码更改为此代码,它将使用ToString("X2"):

public enum Number : byte
{
    Ten = 10
}
Run Code Online (Sandbox Code Playgroud)