使用显式操作符强制转换从枚举转换为字符串并返回

本文关键字:转换 枚举 字符 字符串 返回 串并 操作符 | 更新日期: 2023-09-27 18:08:56

我想使用显式操作符强制转换逻辑将enum转换为字符串。为什么我得到一个"用户定义的转换必须转换到或从封闭类型"?这应该是可能的,因为类型是封闭类型的子类型。

class ConversionDemo{
    public enum Letters { A, B, C };
    public String LetterName { get; }
    public void DoWork(ConversionDemo.Letters letter) {
        this.LetterName = (String)letter;
    }
    public static explicit operator String(ConversionDemo.Letters letter) {
        if (letter == Letters.A) { return "A"; }
        if (letter == Letters.B) { return "B"; }
        if (letter == Letters.C) { return "C"; }
        return "?";
    }
    public static explicit operator ConversionDemo.Letters(String s) {
        if (s == "A") { return Letters.A; }
        if (s == "B") { return Letters.B; }
        return Letters.C;
    }
}

使用显式操作符强制转换从枚举转换为字符串并返回

不能为枚举类型定义转换。您只能为类或结构定义它。请看这个链接。

因此,您需要的另一种选择可以更改转换并将其定义为扩展方法:

public enum Letters { A, B, C };
public static class ConversionExtensions
{
    public static string ConvertToString(this Letters letter)
    {
        if (letter == Letters.A) { return "A"; }
        if (letter == Letters.B) { return "B"; }
        if (letter == Letters.C) { return "C"; }
        return "?";
    }
    public static Letters ConvertToLetter(this string s)
    {
        if (s == "A") { return Letters.A; }
        if (s == "B") { return Letters.B; }
        return Letters.C;
    }
}

然后,您可以使用扩展方法进行转换:

// Declare a enum type object.
Letters firstLetter = Letters.A;
// Convert from enum to string.
string strLetter = firstLetter.ConvertToString();
// Convert back from string to enum.
Letters secondLetter = strLetter.ConvertToLetter(); 

希望有帮助!

"封闭类型"是在其中声明方法的实际类或结构,不适用于任何嵌套类型。所以运算符必须在StringLetters的定义中定义。这两个都不可能。

这个问题处理了一个类似的问题:转换泛型列表时显式转换操作符错误。