c# - अगर एक इफ स्टेटमेंट काम कर रहा है लेकिन स्विच स्टेटमेंट क्यों नहीं है




if-statement switch-statement (3)

मैं एक विवरण से चयनित एनम के मूल्य को प्राप्त करने के लिए एक स्ट्रिंग और एक एनम के आवरण के उपयोग से एक switch स्टेटमेंट बनाने की कोशिश कर रहा हूं। यह बहुत ज्यादा आपको एक स्ट्रिंग को एनम मान पर संग्रहीत करने की अनुमति देता है।

यहाँ मेरा बयान है if :

if (msgComingFromFoo[1] == Convert.ToChar(Message.Code.FOO_TRIGGER_SIGNAL.EnumDescriptionToString()))
{
    //foo
}

और यहाँ मेरा switch स्टेटमेंट है:

switch (msgComingFromFoo[1])
{
    case Convert.ToChar(Message.Code.FOO_TRIGGER_SIGNAL.EnumDescriptionToString()):
        break;
}

if यह कथन स्वीकार कर रहा है if switch क्यों नहीं? जब से मैं एक स्ट्रिंग से एक सूचकांक का चयन कर रहा हूँ, मैंने इसे एक चार में बदलने की कोशिश की, लेकिन दुर्भाग्य से यह काम नहीं किया।

अद्यतन करें:

यह Message.Code है। कोड Message.Code

public class Message
{
    public enum Code
    {
        [Description("A")]
        FOO_TRIGGER_SIGNAL
    }
}

जैसा कि आप देख सकते हैं, मुझे एनम मान के लिए निर्दिष्ट विवरण की आवश्यकता है जो कि 0. नहीं है। Message.Code.FOO_TRIGGER_SIGNAL.EnumDescriptionToString() का उपयोग कर रहा है। कोड। Message.Code.FOO_TRIGGER_SIGNAL.EnumDescriptionToString() उल्लेख किए गए आवरण से Message.Code.FOO_TRIGGER_SIGNAL.EnumDescriptionToString() 0 नहीं


त्रुटि:

एक निरंतर मूल्य अपेक्षित है


@ कोड-अपरेंटिस के उत्तर में जोड़ने के लिए।

यदि आपको पता चल रहा है कि if कथन बहुत लंबा हो रहा है या if else शर्तों के भीतर कई स्थितियाँ हैं। आप कोड को फिर से देख सकते हैं और अपने तर्क को एक वस्तु में बदल सकते हैं और काम को नियंत्रित करने के लिए आगंतुक पैटर्न का उपयोग कर सकते हैं।

कुछ इस तरह:

public interface IMessageLogic 
{
   void ProcessMessage()
}

public class TriggerSignal : IMessageLogic 
{
   public void ProcessMessage() 
   {
       // Do trigger stuff
   }
}

public class FooMessage : IMessageLogic 
{
   public void ProcessMessage() 
   {
       // Do foo stuff
   }
}

public class MessageHandler
{
    public void HandleMessage(IMessageLogic messageLogic)
    {
        messageLogic.ProcessMessage();
    }
}

public static void Main()
{
    IMessageLogic messageLogic = GetMessage();
    var handler = new MessageHandler();

    handler.HandleMessage(messageLogic);
 }

आगंतुक पैटर्न


आपके पास मामले में अभिव्यक्ति नहीं हो सकती है (C # 7 से पहले), लेकिन आप स्विच में कर सकते हैं, इसलिए यह काम करेगा:

switch (ConvertToMessageCode(msgComingFromFoo[1]))
{
    case Message.Code.FOO_TRIGGER_SIGNAL:
        break;
}

जहां आपको Message.Code enum को आवश्यक रूपांतरण करने के लिए ConvertToMessageCode लिखना होगा। ConvertToMessageCode केवल रूपांतरण विवरण को सार करता है, आप पा सकते हैं कि आपको एक अलग विधि की आवश्यकता नहीं है, लेकिन स्विच स्टेटमेंट में इनलाइन कोड के साथ कर सकते हैं, जैसे, एक कास्ट।


यह वास्तव में एक अच्छा जवाब नहीं है क्योंकि यह पिछले उत्तरों पर केवल विस्तार के रूप में कार्य करता है। इसे स्वीकार न करें (कृपया किसी भी उचित जवाब से ऊपर न उठें)। मैं इसे केवल एक उत्तर के रूप में लिख रहा हूं क्योंकि एक टिप्पणी इस स्पष्टीकरण के लायक नहीं होगी।

आपने कोशिश की:

switch (msgComingFromFoo[1])
{
    case Convert.ToChar(Message.Code.FOO_TRIGGER_SIGNAL.EnumDescriptionToString()):
        break;
}

यह काम नहीं करता है क्योंकि मामला स्थिर नहीं है। जैसा कि सुझाव दिया गया है, सबसे अच्छा तरीका यह है कि msgComingFromFoo[1] स्ट्रिंग को msgComingFromFoo[1] वैल्यू में बदलना है ताकि आप msgComingFromFoo[1] पर स्विच कर सकें और स्विच मामलों में msgComingFromFoo[1] का उपयोग कर सकें।

यदि यह किसी तरह संभव नहीं है, तो आप हमेशा स्ट्रिंग स्थिरांक पर स्विच कर सकते हैं। हालांकि, यह त्रुटि प्रवण है और पहली जगह में एनम का उपयोग करने के उद्देश्य को पराजित करता है।

switch (msgComingFromFoo[1])
{
    case "A":
        break;
}

एक और टिप्पणी: याद रखें कि सरणियाँ शून्य-अनुक्रमित हैं । आप वर्तमान में दूसरे तत्व पर स्विच कर रहे हैं, पहले नहीं। पहले तत्व के लिए msgComingFromFoo[0] उपयोग करें।







switch-statement