将String转换为Struct

时间:2013-04-03 20:28:50

标签: c# enums

我有一个基于字符串的枚举创建为结构:

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.Version1;”并且它是相同的结果,除了错误删除“隐含”一词。

3 个答案:

答案 0 :(得分:0)

如果您想返回字符串,那么curVersion应该是string类型,而不是Version

答案 1 :(得分:0)

在您的情况下,适当的解决方案是使用常规枚举:

enum Version
{
    Version1,
    Version2,
}

如果您想获取特定枚举的字符串值,可以使用ToString

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

至于您看到错误的原因,Version.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#中的合法标识符(即包含空格的内容),或者仅仅因为它很长且标识符应该是它的较短版本,这一点尤为重要。

答案 2 :(得分: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");
}