如何在枚举中使用不安全的值?

7
我需要在我的C#应用程序中使用此枚举,但它不允许我使用这些值。当我将类型指定为uint时,我可以使用-1值,而当我指定int时,我无法使用最后两个值。是否有一种方法可以在这里使用unchecked关键字,以允许我定义所有这些值?这些值来自外部来源,因此我无法更改它们。
internal enum MyValues : int
{
    value1 = -1,
    value2 = 0,
    value3 = 0x80000000,
    value4 = 0xFFFFFFFF
}
5个回答

8
如果你想让“-1”和“0xFFFFFFFF”这两个值不同,你需要使用比32位更大的数据类型。尝试使用“long”。

使用64位数据类型不是一个选项,我正在使用Interop返回32位值。 - Jon Tackabury
如果在使用uint时,-1和0xFFFFFFFF在技术上是相同的东西,那么我猜我可以只移除-1的值? - Jon Tackabury
1
@Jon:当你使用uint时,-1不存在,你必须进行未经检查的转换。 - Jon Skeet
我知道-1不存在,我希望它溢出并环绕。我猜如果它这样做了,-1只不过是0xFFFFFFFF,对吗? - Jon Tackabury
1
@Jon T:没错。-1的二进制补码表示所有位都是1 - 因此在32位中,这与无符号数0xFFFFFFFF相同。 - AakashM
显示剩余6条评论

5

0xFFFFFFFF是一个32位的数字,因此应适合于枚举类型:int (我觉得long类型有些过头了:))

你试过了吗?

enum YourEnum : int { /*...*/, value4 = unchecked( (int)0xFFFFFFFF ) };

2

由于这些值看起来是固定的,只需创建一个静态类来保存这些值。此外,您可以使用任何类型:

public static class MyValues
{
    public const int value1 = -1;
    public const int value2= 0;
    public const int value3 = 0x80000000;
    public const int value4 = 0xFFFFFFFF;
}

2

解决这个问题的一种方法是使用普通值来表示enum(0,1,2,3),并创建一个类或一对方法来将传入的值转换为enum成员,反之亦然。


写了一篇很长的帖子,然后注意到你说了同样的话。+1。@Jon Tackabury:@Jon Seigel的答案是最可维护的选项。除非您对使用的库非常熟悉,否则不要假设-1与0xFFFFFFFF相同。 - Randolpho

1

也许尝试使用ulong枚举而不是int?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接