2013-08-16 4 views
8

このswich文が動作しないのはなぜ、エラー与える:自体にスイッチ式またはケースラベルがブール値(または...)でなければなりません

switch (btn.BackColor) 
{ 
    case Color.Green: 
     break; 
    case Color.Red: 
     break; 
    case Color.Gray: 
     break; 
} 
+1

「btn.BackColor」の種類は何ですか? – Floremin

+0

はボタンです。 – NoviceToDotNet

+0

私は 'btn.BackColor'のタイプについて、特に' btn'ではなく、尋ねています。 – Floremin

答えて

6

エラーで:

A switch expression or case label must be a bool, char, string, integral, enum, or corresponding nullable type

コードを自己説明的です。スイッチの式は、sbyte、byte、short、ushort、int、uint、long、ulong、char、stringのいずれかである必要があります。またはC#言語仕様として

exactly one user-defined implicit conversion (§6.4) must exist from the type of the switch expression to one of the following possible governing types: sbyte, byte, short, ushort, int, uint, long, ulong, char, string, or, a nullable type corresponding to one of those types.

ことを示唆しているそして、あなたはBackColorプロパティは、ここにあなたのタイプを返して、それが故に、エラーを上記のルールのいずれかを満たしていないことがわかります。

あなたは、問題は、あなたがswitch文でColorを使用することはできませんで、この

switch (btn.BackColor.Name) 
{ 
    case "Green": 
     break; 
    case "Red": 
     break; 
    case "Gray": 
     break; 
} 
6

のようにそれを行うことができます。 sbytebyteshortushortintuintlongulongcharstring

:それは、次のいずれかのタイプ、タイプのいずれか、または、またはこれらのいずれかのタイプに変換のNULL可能バージョンである必要がありますC#言語仕様、8.7.2から:

• Otherwise, exactly one user-defined implicit conversion (§6.4) must exist from the type of the switch expression to one of the following possible governing types: sbyte, byte, short, ushort, int, uint, long, ulong, char, string, or, a nullable type corresponding to one of those types.

あなたのケースでは、文字列を使用して、あるいは単にif/elseステートメントのセットを使用することによってこの問題を回避できます。

3

一体型ではないため、BackColorをオンにすることはできません。

整数型、列挙型(事実上の整数型)、および文字と文字列のみをオンにすることができます。

BackCOlorという固有のプロパティ(たとえば、Name)を見つけて、それをオンにする必要があります。

2

他の回答が指摘したように、System.Drawing.Colorswitchステートメントの使用可能なタイプではありません。 Colorは、コード内の列挙型のように動作するため、興味深いタイプですが、それは、それぞれSystem.Drawing.KnownColorの静的プロパティを持つためです。これは列挙型です。

public static Color Green 
{ 
    get 
    { 
    return new Color(KnownColor.Green); 
    } 
} 

は、情報のこのビットを知って、あなたはスイッチでBackColorプロパティを使用するには、このようなあなたのコードを書くことができます:あなたはコードでColor.Greenを見たときだから、ここColorクラスは舞台裏でやっていることである

if (btn.BackColor.IsKnownColor) 
{ 
    switch (btn.BackColor.ToKnownColor()) 
    { 
     case KnownColor.Green: 
      break; 
     case KnownColor.Red: 
      break; 
     case KnownColor.Gray: 
      break; 
    } 
} 
else 
{ 
    // this would act as catch-all "default" for the switch since the BackColor isn't a predefined "Color" 
} 
関連する問題