0

I want to convert from an enum to a string using explicit operator casting logic. Why am I getting a “User-defined conversion must convert to or from the enclosing type”? It should be possible to do that since the types are sub-types of the enclosing types.

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

2 Answers2

1

You cannot define conversions for a enum type. You can only define it for classes or structs. See this link.

So, an alternative for what you need can be change your conversions and define it as extension methods:

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

And then, you can use the extension methods for conversion:

// 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(); 

Hope it helps!

Hernan Guzman
  • 1,235
  • 8
  • 14
0

The "enclosing type" is the actual class or struct that the method is declared in and does not apply to any nested types. So the operators would have to be defined inside the definition of String or Letters. Neither of which is possible.

This question deals with a similar issue: explicit conversion operator error when converting generic lists.

Community
  • 1
  • 1
shf301
  • 31,086
  • 2
  • 52
  • 86