【问题标题】:Convert String to Struct将字符串转换为结构
【发布时间】:2013-04-03 20:28:49
【问题描述】:

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

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

但是,它在“return Version.Version1;”上抛出错误说:

Cannot implicitly convert type 'string' to 'Version'

如何转换?

我也试过“(Version)return Version.Version1;”除了错误删除了“隐式”一词之外,结果相同。

【问题讨论】:

  • “基于字符串的枚举创建为结构”?!
  • 你的结构没有任何字段,虽然返回它没有意义
  • “基于字符串的枚举创建为结构”?!
  • 错误 Cannot implicitly convert type 'string' to 'Verion' 甚至与您的代码不匹配....使用枚举器在像这样的情况。
  • "创建为结构的基于字符串的枚举"!!!!!

标签: c# enums


【解决方案1】:

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

【讨论】:

  • 但是它并不强制只有这两个值是对象的有效值。
  • @Servy 当然可以,但是如果没有适当的枚举,您将无法做到这一点。
  • 当然可以。另外,谁说你不能使用正确的枚举?请参阅我的回答,了解这两种方法如何解决问题。
【解决方案2】:

您的结构毫无意义,因为它没有任何实例字段。 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");
}

【讨论】:

  • 这就是我目前所做的,我只是希望有一种方法可以强输入我的字符串......猜不出来。
  • @YongkeBillYu 肯定有办法。其中最简单的就是使用enum。这实际上就是他们为之而生的确切情况。
  • 是的,但它们只允许整数!
  • @YongkeBillYu 没关系。您可以利用ToString 来获取代表该枚举的字符串值。此外,它不仅仅是整数,它是任何整数类型,但这与这里无关。
【解决方案3】:

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

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# 中的合法标识符(即其中包含空格的东西)或者可能只是因为它很长并且标识符应该是它的较短版本,这一点尤其重要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-28
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-25
    • 2015-09-09
    相关资源
    最近更新 更多