2013-04-03 2 views
-4

У меня есть на основе перечислимой строки создан как структура:Преобразовать Строка STRUCT

public struct Version { 
    public const string 
     Version1 = "Version1", 
     Version2 = "Version2"; 
} 

И я пытаюсь использовать его как это:

public Version curVersion { 
     get { 
      if (ConfigurationManager.AppSettings["Version"] == "Version1") { 
       return Version.Version1; 
      } 
      return Version.Version2; 
     } 
    } 

Однако, это бросает ошибку на «возвращение Version.Version1;» говоря:

Cannot implicitly convert type 'string' to 'Version' 

Как исправить?

Я также попробовал "(Версию) return Version.Version1;" и это тот же результат, за исключением того, что ошибка опустила слово «неявно».

+6

«строка на основе перечисления, созданного в качестве структуры» ?! – wRAR

+0

у вас в структуре нет поля и, хотя бессмысленно возвращать его – Lanorkin

+0

"string based enum created as a struct" ?! –

ответ

0

Если вы хотите вернуть строки, то curVersion должен быть типа string, а не Version.

+0

Но тогда это не гарантирует, что только те два значения являются действительными значениями объекта. – Servy

+0

@Servy конечно, но вы не можете сделать это без правильного перечисления. – wRAR

+0

Конечно, вы можете. Кроме того, кто говорит, что вы не можете использовать правильное перечисление? См. Мой ответ о том, как любой подход может решить проблему. – Servy

0

Соответствующее решение в вашем случае было бы просто использовать регулярные перечисления:

enum Version 
{ 
    Version1, 
    Version2, 
} 

Если вы хотите, чтобы получить строковое значение конкретного перечисления, вы можете просто использовать ToString:

string s = Version.Version1.ToString();//this will result in the string "Version1" 

Что касается того, почему вы видите ошибку, у вас есть , в вашем коде не экземпляр Version. Переменная имеет тип String. Тот факт, что он определен в классе Version, не делает его экземпляром Version. Вам нужно будет создать new Version и вернуть его для компиляции.

Хотя вы можете создать свой собственный тип перечисления на основе строк, просто не нужно. Вы можете просто использовать ToString, как я сказал ранее. Если вы хотите сделать это в любом случае, хотя код может выглядеть примерно так:

public struct Version 
{ 
    private string value; 
    private Version(string value) 
    { 
     this.value = value; 
    } 

    public static readonly Version Version1 = new Version("Version1"); 
    public static readonly Version Version2 = new Version("Version2"); 

    public override string ToString() 
    { 
     return value; 
    } 
} 

Вы можете взять его дальше, чтобы добавить функциональные возможности для анализа, сравнения, равенство и т.д. все они основаны на базовом значении строки.

Основная причина использования этого настраиваемого типа «перечисления строк» ​​была бы, если важно, чтобы строковое значение перечисления отличалось от имени переменной, используемого для его представления. Это особенно важно, если строковое значение не является юридическим идентификатором в C# (т. Е. Что-то, что содержит пробелы в нем) или, возможно, только потому, что оно очень длинное, а идентификатор должен быть более коротким.

0

Ваша структура совершенно бессмысленна, поскольку в ней нет полей экземпляра. Cosider его изменения в static класса, как это:

public static class Version { 
    public const string 
     Version1 = "Version1", 
     Version2 = "Version2"; 
} 

Тогда Version1 и Version2 имеют тип string. Возможно, ваше имущество curVersion должно иметь тип string, а затем?


Если вы действительно хотите-структуру, вы можете изменить его в этом:

public struct Version { 
    public readonly string Text; 

    Version(string text) { 
     Text = text; 
    } 

    public static readonly Version Version1 = new Version("Version1"); 
    public static readonly Version Version2 = new Version("Version2"); 
} 
+0

Это то, что я сейчас делаю, я просто надеялся, что есть способ сильно набрать мою строку ... предположим, нет. – Bill

+0

@YongkeBillYu там, конечно, есть способ. Самый простой из которых - просто использовать 'enum'. Это буквально точный случай, за который они были построены. – Servy

+0

Да, но они допускают только целое число! – Bill

Смежные вопросы