2013-04-03 60 views
-4

我必須爲結構創建基於字符串的枚舉:字符串轉換爲結構

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' 

如何轉換?

我也試過「(Version)return Version.Version1;」除了錯誤「隱含」這個詞之外,結果是一樣的。

+6

「爲結構創建基於字符串枚舉」? – wRAR 2013-04-03 20:31:16

+0

你的結構沒有任何字段,雖然沒有意義返回它 – Lanorkin 2013-04-03 20:31:53

+0

「基於字符串的枚舉創建爲結構」?! – 2013-04-03 20:32:20

回答

0

如果要返回字符串,則curVersion應該是string而不是Version

+0

但是,它不強制只有這兩個值是對象的有效值。 – Servy 2013-04-03 20:41:52

+0

@Servy肯定,但你不能沒有適當的枚舉。 – wRAR 2013-04-03 20:58:42

+0

當然可以。另外,誰說你不能使用適當的枚舉?請參閱我的答案,瞭解這兩種方法如何解決問題。 – Servy 2013-04-03 21:00:30

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"; 
} 

然後Version1Version2有型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 2013-04-03 20:42:26

+0

@YongkeBillYu當然有一種方法。最簡單的就是使用'enum'。這實際上是他們爲之建造的確切案例。 – Servy 2013-04-03 20:43:03

+0

是的,但他們只允許整數! – Bill 2013-04-03 20:44:28