2010-07-11 96 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

相關問題