У нас есть коды символов прежней версии, которые мы хотим сохранить как числа в новой системе. Для увеличения readibility и общего понимания в коде для devs создание миграции я хочу сделать Перечисления как это...
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#? Существует ли лучший путь?
Я только что просмотрел эту же проблему с оболочкой .Net для библиотеки FreeImage. Я создал две конфигурации сборки: одну для x86 и одну для x64 для проекта, ссылающегося на управляемую оболочку. Я добавил разделы условной копии msbuild в цель AfterBuild файла проекта так:
<Target Name="AfterBuild">
<Copy Condition="'$(Platform)' == 'X86'" SourceFiles="$(MSBuildProjectDirectory)\Resources\x86\FreeImage.dll" DestinationFolder="$(TargetDir)" />
<Copy Condition="'$(Platform)' == 'X64'" SourceFiles="$(MSBuildProjectDirectory)\Resources\x64\FreeImage.dll" DestinationFolder="$(TargetDir)" />
</Target>
-121--4349624- Вызов метода не является постоянным выражением. Попробуйте это:
public enum Status {
Open = 'O',
Closed = 'C',
Pending = 'P',
EnRoute = 'E'
}
Причина AscW
работает в VB в том, что это внутренняя вещь, которую компилятор VB понимает и оценивает во время компиляции и считается компилятором постоянным выражением. Даже в VB Convert.ToInt32
не будет работать.
Чтобы процитировать визуальную базовую спецификацию :
11,2 Константные выражения
Константное выражение - это выражение, значение которого может быть полностью вычислено во время компиляции. [...] В постоянных выражениях допускаются следующие конструкции:
[...]
следующие функции во время выполнения:
Microsoft. VisualBasic. Последовательности. ChrW
Microsoft. VisualBasic. Последовательности. Chr
, если постоянная величина между 0 и 128Microsoft. VisualBasic. Последовательности. AscW
, если постоянная последовательность не пустаMicrosoft. VisualBasic. Последовательности. Asc
, если постоянная последовательность не пуста
Попробуйте это:
public enum Status
{
Open = 'O',
Closed = 'C',
Pending = 'P',
EnRoute = 'E'
}