Сравнение строкового значения со строковым значением перечисления - PullRequest
1 голос
/ 17 сентября 2011

Код C # ниже дает мне ошибку в двух строках, начинающихся с case. Ошибка: «Ожидается постоянное значение»

Код VB.NET ниже работает. Я использую этот код в качестве примера для моего реального приложения, написанного на C #.

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

ExportFormatType - это перечисление в сторонней библиотеке.

Есть предложения? Спасибо!

public void ExportCrystalReport(string exportType, string filePath)
    {
        if (_CReportDoc.IsLoaded == true)
        {
            switch (exportType)
            {
                case  ExportFormatType.PortableDocFormat.ToString():  // Or "PDF"
                    ExportTOFile(filePath, ExportFormatType.PortableDocFormat);
                    break;
                case ExportFormatType.CharacterSeparatedValues.ToString(): // Or "CSV"
                    ExportTOFileCSV(filePath, ExportFormatType.CharacterSeparatedValues);

                    break;
            }
        }


 Public Sub ExportCrystalReport(ByVal exportType As String, ByVal filePath As String)

        If _CReportDoc.IsLoaded = True Then
            Select Case exportType
                Case ExportFormatType.PortableDocFormat.ToString 'Or "PDF"
                    ExportTOFile(filePath, ExportFormatType.PortableDocFormat)
                Case ExportFormatType.CharacterSeparatedValues.ToString ' Or "CSV"
                    ExportTOFileCSV(filePath, ExportFormatType.CharacterSeparatedValues)

1 Ответ

5 голосов
/ 17 сентября 2011

В C # метки операторов case должны быть значениями, известными во время компиляции. Я не верю, что это же ограничение справедливо для VB.NET.

В принципе, ToString() может запускать произвольный код, поэтому его значение неизвестно во время компиляции (даже если в вашем случае это enum).

Для решения этой проблемы вы можете сначала проанализировать exportType в перечислении и включить значение перечисления в C #:

ExportFormatType exportTypeValue = Enum.Parse(typeof(ExportFormatType), exportType);
switch( exportTypeValue )
{
    case ExportFormatType.PortableDocFormat: // etc...

или вы можете преобразовать переключатель в оператор if / else:

if( exportType == ExportFormatType.PortableDocFormat.ToString() )
   // etc...
...