[英]Enum of long values in C#
为什么这个声明,
public enum ECountry : long
{
None,
Canada,
UnitedStates
}
需要对其任何值进行强制转换?
long ID = ECountry.Canada;
// Error Cannot implicitly convert type 'ECountry' to 'long'.
// An explicit conversion exists (are you missing a cast?)
除了强制转换之外,还有没有办法直接从枚举中获取长值?
这也不起作用,例如:
public enum ECountry : long
{
None = 0L,
Canada = 1L,
UnitedStates=2L
}
问题不在于底层类型仍然是int
。 它是long
,您可以为成员分配long
值。 但是,您永远不能只将enum
值分配给没有强制转换的整数类型。 这应该有效:
public enum ECountry : long
{
None,
Canada,
UnitedStates = (long)int.MaxValue + 1;
}
// val will be equal to the *long* value int.MaxValue + 1
long val = (long)ECountry.UnitedStates;
enum
的默认基础类型是int
。 enum
可以是除char
之外的任何整数类型。
如果你想让它很long
,你可以这样做:
// Using long enumerators
using System;
public class EnumTest
{
enum Range :long {Max = 2147483648L, Min = 255L};
static void Main()
{
long x = (long)Range.Max;
long y = (long)Range.Min;
Console.WriteLine("Max = {0}", x);
Console.WriteLine("Min = {0}", y);
}
}
演员在这里很重要。 正如@dlev 所说,在enum
中使用long
的目的是支持大量标志(超过 32 个,因为 2^32 是 4294967296 并且long
可以容纳超过 2^32)。
您必须强制转换枚举以从中获取值,否则它将保持enum
类型。
来自 MSDN :
在本例中,base-type 选项用于声明其成员为 long 类型的枚举。 请注意,即使枚举的基础类型是 long,枚举成员仍必须使用强制转换显式转换为 long 类型。
// keyword_enum2.cs
// Using long enumerators
using System;
public class EnumTest
{
enum Range :long {Max = 2147483648L, Min = 255L};
static void Main()
{
long x = (long)Range.Max;
long y = (long)Range.Min;
Console.WriteLine("Max = {0}", x);
Console.WriteLine("Min = {0}", y);
}
}
Output
最大值 = 2147483648 最小值 = 255
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.