2010-07-11 59 views
1

我有这样的枚举:一个枚举只能保存数值而不是字符串?

enum ASCIIChars 
     { 
      BLACK = "@", 
      CHARCOAL = "#", 
      DARKGRAY = "8", 
      MEDIUMGRAY = "&", 
      MEDIUM = "o", 
      GRAY = ":", 
      SLATEGRAY = "*", 
      LIGHTGRAY = ".", 
      WHITE = " " 
     }; 

这里是我使用它:

private void GetShadeColor(int redValue) 
     { 
      string ASCII = " "; 

      if (redValue >= 230) 
      { 
       ASCII = ASCIIChars.WHITE; 
      } 
      else if (redValue >= 200) 
      { 
       ASCII = ASCIIChars.LIGHTGRAY; 
      } 
      else if (redValue >= 180) 
      { 
       ASCII = ASCIIChars.SLATEGRAY; 
      } 
      else if (redValue >= 160) 
      { 
       ASCII = ASCIIChars.GRAY; 
      } 
      else if (redValue >= 130) 
      { 
       ASCII = ASCIIChars.MEDIUM; 
      } 
      else if (redValue >= 100) 
      { 
       ASCII = ASCIIChars.MEDIUMGRAY; 
      } 
      else if (redValue >= 70) 
      { 
       ASCII = ASCIIChars.DARKGRAY; 
      } 
      else if (redValue >= 50) 
      { 
       ASCII = ASCIIChars.CHARCOAL; 
      }      
      else 
      { 
       ASCII = ASCIIChars.BLACK; 
      } 

      ASCIIArt.Append(ASCII); 
     } 

我得到的枚举声明以下错误:

无法隐式转换字符串INT。

+2

顺便说一句,这是一种可怕的方式来将颜色转换为单色。 – 2010-07-11 01:02:29

+2

@Ed - 他没有转换为单色,它会出现他将红色阴影映射到ASCII字符以生成ASCII艺术。你有更好的方式来做这件事吗? – 2010-07-11 02:25:30

回答

2

是的,你不能那样做。枚举值仅为数字。考虑定义一个静态结构映射枚举值字符串/字符值,或更改您的枚举类与一个预定义的静态实例对应于每个枚举值。

3

我会推荐使用Dictionary<AsciiCharacters, char>来代替。

另一种方法是to use attributes,但我不确定它是否对您的情况非常有帮助。

0

使用'@'而不是"@"

2

你有什么特别的依恋使用枚举?如果没有,你可以接近你想要通过使用静态类常量来代替:

public static class AsciiChars 
{ 
    public const string Black = "@"; 
    public const string Charcoal = "#"; 
    ... 
    public const string White = " "; 
} 

然后,您可以使用这些值,就像你已经在你的代码示例规定:

string ascii; 
if (redValue >= 230) 
{ 
    ascii = AsciiChars.White; 
} 
0

你不能直接持有字符串,但可以使用注释分配字符串值并使用反射进行检索。

Have a look at this

相关问题