goo*_*ate 5 c# compiler-construction enums enum-flags visual-studio-2013
编译但不应该
[Flags]
enum TransactionData : long // 64 bits. Last bit is sign bit, but I'm putting data there
{
None = 0,
Color1 = 1 << 63,
}
Run Code Online (Sandbox Code Playgroud)
错误但不应该
[Flags]
enum TransactionData : ulong // 64 bits. No sign bit. Not allowed to put data there
{
None = 0,
Color1 = 1 << 63,
}
Run Code Online (Sandbox Code Playgroud)
编译器错误文本:
-2147483648无法转换为ulong
题:
我希望会发生相反的情况.谁能解释为什么会这样?
我也可以如何打印这个flags属性byte[]进行检查?
var eee = TransactionData.None | TransactionData.Color1
// How do I convert eee to byte[]?
Run Code Online (Sandbox Code Playgroud)
p.s*_*w.g 12
请注意,这1 << 63不是一个ulong甚至是一个long.编译器将其解释为int.请注意以下示例:
enum TransactionData : long
{
None = 0,
Color1 = 1 << 31,
Color2 = 1 << 63,
}
Console.WriteLine(TransactionData.Color1 == TransactionData.Color2); // True
Run Code Online (Sandbox Code Playgroud)
但是,您可以ulong通过添加ul到结尾来强制编译器将其解释为:
enum TransactionData : ulong
{
None = 0,
Color1 = 1ul << 63,
}
Run Code Online (Sandbox Code Playgroud)
虽然很多人更喜欢使用大写字母,L因为小写l看起来很像一个数字1.可以在此处找到编译器支持的后缀的完整列表.
另外,我应该指出1ul << 63实际上是64位宽(它是一位,移位63位).