关于c#:将Enum指定为uint的原因是什么?


What is the reason for specifying an Enum as uint?

我遇到了一些继承了uint的枚举器。我不明白为什么会有人这么做。

例子:

1
2
3
4
Enum myEnum : uint
{
   ...
}

有什么优势或具体的原因有人会这么做吗?为什么不把它作为默认值?


如果枚举值大于2147483647且非负。


我能想到的一个原因是范围检查更容易。考虑到大多数枚举从0开始,您只需要检查上限。


我想这是为了让它自动转换为uint(在c中,枚举被类型系统视为int)。很可能允许对枚举的标志值进行按位排序。参见http://www.velocityreviews.com/forums/t286596-enums-in-c-and-c.html


在某些情况下,使用.NET中的com interop/p/invoke非常方便和必要。例如,您一定会在pinvoke.net上找到一些这样定义的。在某些情况下,它只是更接近底层API定义,但不是必需的,但在某些情况下,底层API可能会使用其中一些高位作为标记,并且需要uint。在interop之外,您也可以使用一些非常高的位作为标记,仅在普通的c/vb.net中使用,这也可能需要uint。


我正在将一些最初用C编写的消息传递代码转换为C。

C代码中的某些字段有一组有限的可能值,这些值被定义为一组关联的定义。换句话说,是一个枚举。

在转换某些枚举时,某些值对于整数来说太大,例如

#无定义0x00000000

#定义val1 0x00000001

#定义VALX 0x8000000

在这里,对于C中的默认枚举,valx是不可接受的,因此枚举必须转换为uint,uint也是记录结构中存储变量的类型。


我知道另一个原因,因为一个同事在这里做的。

为了避免这里解释的问题(第2项),在生成枚举列表时,他根据字符串给它一个唯一的值(我不清楚现在如何,它不能是hashcode'cos that's not unique)。

唯一的问题是这些数字有点大,所以他把枚举设置为uint。


看起来他们这样做纯粹是为了这个错误,这意味着可能还有更多的错误没有在这个类中实现。

1
2
3
4
    /// <summary>
    /// There was an HTTP error in issuing the request.
    /// </summary>
    HttpError = 0xFFFF0000

我所说的例子在这里的代码中:http://www.codeplex.com/facebooknet

看看facebookresponsestatus.cs类

我可以给作者发电子邮件,但我不想费事,只想看看一般社区的人们基于其他经验的想法。

我不打算在codeplex上使用这个框架,而是回顾它,看看其他人是如何将facebook实现到.net上的。我只是觉得这很有趣,想知道为什么:uint代表那里的枚举。