Различия между перечислениями в C # и VB.NET - PullRequest
5 голосов
/ 14 января 2010

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

Public Enum Status As Short
    Open = AscW("O")
    Closed = AscW("C")
    Pending = AscW("P")
    EnRoute = AscW("E")
End Enum

При такой настройке код будет читабелен (представьте If Record.Status = Status.Open), и все же значения будут храниться в базе данных в виде небольших чисел, что будет эффективно Однако ... Я парень из VB.NET, но все хотят писать код на C #, поэтому мне нужна такая структура в C #.

После поиска в Google я обнаружил, что общий .NET-эквивалент AscW равен Convert.ToInt32("C"). Когда я пытаюсь использовать этот оператор в перечислении, я получаю ошибку компилятора «Требуется постоянное выражение».

Как я могу сделать это в C #? Есть ли лучший способ?

Ответы [ 2 ]

10 голосов
/ 14 января 2010

Вызов метода не является константным выражением. Попробуйте это:

public enum Status { 
   Open = 'O',
   Closed = 'C',
   Pending = 'P',
   EnRoute = 'E'
}

Причина, по которой AscW работает в VB, заключается в том, что это внутренняя вещь, которую компилятор VB понимает и оценивает во время компиляции и считает компилятором постоянное выражение. Даже в VB Convert.ToInt32 не будет работать.

Цитировать Visual Basic спецификацию :

11.2 Выражения констант

Постоянное выражение - это выражение, значение которого может быть полностью оценено во время компиляции. [...] В константных выражениях допускаются следующие конструкции:

[...]

  • Следующие функции времени выполнения:

    • Microsoft.VisualBasic.Strings.ChrW
    • Microsoft.VisualBasic.Strings.Chr, если постоянное значение находится в диапазоне от 0 до 128
    • Microsoft.VisualBasic.Strings.AscW, если постоянная строка не пуста
    • Microsoft.VisualBasic.Strings.Asc, если постоянная строка не пуста
3 голосов
/ 14 января 2010

Попробуйте это:

public enum Status
{
    Open    = 'O',
    Closed  = 'C',
    Pending = 'P',
    EnRoute = 'E'
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...