В чем причина указания Enum как uint?

Я столкнулся с некоторыми Перечислителями, унаследовавшими uint. Я не мог понять, почему кто-то это сделает.

Пример:

Enum myEnum : uint
{
   ...
}

Любое преимущество или конкретная причина, по которой кто-то это сделает? Почему бы просто не оставить его как defaultint?

Ответ 1

Одна из причин, по которой я могу думать, - это то, что проверка диапазона проще. Учитывая, что большинство перечислений начинаются с 0, вам нужно будет только проверить верхнюю границу.

Ответ 2

если значения перечисления больше, чем 2 147 483 647 и неотрицательные.

Ответ 3

Я бы предположил, что это было сделано, чтобы позволить ему автоматически вводиться в uint (в C, перечисления были обработаны как ints системой типов). Вполне возможно разрешить побитовое ORing значений флага для перечисления. см. http://www.velocityreviews.com/forums/t286596-enums-in-c-and-c.html

Ответ 4

Это удобно и абсолютно необходимо в некоторых случаях при работе с COM Interop/P/Invoke из .NET. Например, вы, безусловно, найдете некоторые в pinvoke.net, определенные таким образом. В некоторых случаях он просто сопоставляется с базовым определением API, но не является необходимым, но в некоторых случаях базовый API может использовать некоторые из этих высоких бит для флагов, и он должен быть UINT. Вне Interop вы можете использовать некоторые очень высокие биты в качестве флагов слишком просто в С#/VB.NET, и для этого также может потребоваться uint.

Ответ 5

Я конвертирую код обмена сообщениями, первоначально написанный на C в С#.

Некоторые поля в коде C имеют ограниченный набор возможных значений, определенных как ассоциированная группа из #defines. Другими словами, перечисление.

При преобразовании некоторых из этих перечислений некоторые значения слишком велики для целого числа, например.

#define NONE 0x00000000

#define VAL1 0x00000001

...

#define VALX 0x80000000

Здесь VALX не будет приемлемым для перечисления по умолчанию в С#, поэтому перечисление должно быть выбрано как uint, что также является типом переменной хранения в структуре записи.

Ответ 6

Пример, о котором я говорю, приведен в коде: http://www.codeplex.com/FacebookNET

Взгляните на класс FacebookResponseStatus.cs

Я мог бы написать письмо автору, но я подумал, что не надо беспокоиться и просто посмотреть, что люди думают в общем сообществе, исходя из других событий.

Я не буду использовать эту фреймворк в CodePlex, но просматривал ее, чтобы увидеть, как другие внедряют Facebook в .NET. Я просто подумал, что это интересно, и хотел узнать, почему: uint для Enums там.

Ответ 7

похоже, что они делают это исключительно для этой одной ошибки, а это значит, что в этом классе, вероятно, больше не реализовано ошибок.

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

Ответ 8

Я знаю другую причину, потому что коллега сделал это здесь.

Чтобы избежать описанной проблемы здесь (пункт 2), при создании списка перечислений он дает уникальное значение на основе строки (я не могу точно помните, как теперь, это не может быть хэш-код, потому что он не уникален.

Единственная проблема заключалась в том, что числа выглядели немного большими, поэтому он сделал перечисление uint.