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

C# 如何在枚举中使用不安全的值?,c#,interop,enums,unsafe,C#,Interop,Enums,Unsafe,我需要在C#应用程序中使用此枚举,但它不允许我使用这些值。当我将类型指定为uint时,我可以使用-1值,而当我指定int时,我不能使用最后2个值。有没有办法在这里使用unchecked关键字来定义所有这些值?这些值来自外部源,因此我无法更改它们 internal enum MyValues : int { value1 = -1, value2 = 0, value3 = 0x80000000, value4 = 0xFFFFFFFF } 可能尝试使用ulong

我需要在C#应用程序中使用此枚举,但它不允许我使用这些值。当我将类型指定为uint时,我可以使用-1值,而当我指定int时,我不能使用最后2个值。有没有办法在这里使用unchecked关键字来定义所有这些值?这些值来自外部源,因此我无法更改它们

internal enum MyValues : int
{
    value1 = -1,
    value2 = 0,
    value3 = 0x80000000,
    value4 = 0xFFFFFFFF
}

可能尝试使用ulong枚举而不是int?

如果希望
-1
0xFFFFFFFF
的值不同,则需要大于32位的数据类型。尝试
long

因为这些值看起来是常量,所以只需创建一个静态类来保存这些值。此外,您可以使用您想要的任何类型:

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

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

0xFFFFFFFF是一个32位的数字,因此它应该适合于enum:int (我觉得长型太夸张了:))

你试过了吗

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

使用64位数据类型不是选项,我使用interop返回32位值。如果使用uint时-1和0xFFFFFF在技术上是相同的,我想我可以删除-1值?@Jon:-1在使用uint时不存在-你必须进行未经检查的转换。我知道-1不存在,我想让它溢出来,然后卷起来。我猜如果它那样做,-1就是0xFFFFFFFF,对吗?@Jon T:没错。2的补码表示-1的所有位都已设置,因此在32位中,这与
0xFFFFFFFF
作为无符号表示相同。写了这篇长文章,然后注意到你说了同样的话+1. @乔恩·塔卡布里:@Jon Seigel的答案是最容易维护的选项。不要假设-1与0xFFFFFFFF相同,除非您对正在使用的库非常熟悉。