2013-08-16 30 views
8

क्यों इस swich बयान काम नहीं करते, त्रुटि देता है: अपने आप में मेंएक स्विच अभिव्यक्ति या मामले लेबल bool (या ...) होना चाहिए

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, बाइट, लघु, ushort, int, uint, long, ulong, char, string। या सी # भाषा विनिर्देश पता चलता है

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 (btn.BackColor.Name) 
{ 
    case "Green": 
     break; 
    case "Red": 
     break; 
    case "Gray": 
     break; 
} 
6

समस्या की तरह कर सकते हैं आप एक switch बयान में एक Color उपयोग नहीं कर सकते है। sbyte, byte, short, ushort, int, uint, long, ulong, char, string

: यह इन प्रकारों में से एक के लिए निम्न प्रकारों में से एक, प्रकारों में से एक के एक नल संस्करण, या या परिवर्तनीय होना चाहिए सी # भाषा कल्पना से, 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 पर स्विच नहीं कर सकते क्योंकि यह एक अभिन्न प्रकार नहीं है।

आप केवल पूर्णांक प्रकार, enums (जो प्रभावी रूप से पूर्णांक प्रकार हैं) और वर्ण और तारों पर स्विच कर सकते हैं।

आपको BackCOlor की एक संपत्ति को खोजने की आवश्यकता होगी जो अद्वितीय है (जैसे Name) और उस पर स्विच करें।

2

जैसा कि अन्य उत्तरों ने इंगित किया है, System.Drawing.Colorswitch कथन में उपयोग करने योग्य प्रकार नहीं है। Color एक दिलचस्प प्रकार है क्योंकि यह कोड में enum की तरह व्यवहार करता है, लेकिन ऐसा इसलिए है क्योंकि प्रत्येक System.Drawing.KnownColor के लिए इसकी स्थिर संपत्ति है, जो एक enum प्रकार है। तो जब आप कोड में Color.Green देखते हैं, यहाँ क्या Color वर्ग पर्दे के पीछे कर रहा है:

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

जानकारी के इस बिट जानने के बाद, आप की तरह इस एक स्विच में BackColor संपत्ति का उपयोग करने के लिए अपने कोड लिख सकते हैं:

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" 
} 
संबंधित मुद्दे