Mar*_*wie -3 c# enums tostring
Enum.ToString(string)不支持直接使用精度说明符X2或D5将填充应用于数值. 格式类似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)