2013-04-03 59 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