2012-09-21 29 views
6

मल्टीकास्ट प्रतिनिधियों के पास वापसी का प्रकार होना चाहिए अन्यथा यह एक अपवाद फेंक देगा।मल्टीकास्ट प्रतिनिधियों के पास वापसी का एक प्रकार होना चाहिए। क्यूं कर?

मैं जानना चाहता हूं कि इसके पीछे क्या कारण है, क्या होगा यदि एकाधिक विधियों के प्रतिनिधि के रूप में एक ही रिटर्न प्रकार हो सकता है?

+2

क्या आप एक उदाहरण प्रदान कर सकते हैं जहां यह अपवाद फेंकता है? –

उत्तर

25

आधार गलत है; यह ठीक काम करता है:

Func<int> func = delegate { Console.WriteLine("first part"); return 5; }; 
func += delegate { Console.WriteLine("second part"); return 7; }; 
int result = func(); 

यह गैर-शून्य परिणाम वाला एक मल्टीकास्ट प्रतिनिधि है, ठीक काम कर रहा है। आप कंसोल से देख सकते हैं कि दोनों भागों को निष्पादित किया गया। का परिणाम अंतिम आइटम एक लौटा दिया गया है। हम प्रदर्शन कर सकते हैं कि यह एक सच बहुस्त्र्पीय प्रतिनिधि है:

if(func is MulticastDelegate) Console.WriteLine("I'm multicast"); 

और यह लिखेंगे "मैं बहुस्त्र्पीय हूँ" सिर्फ पहली पंक्ति के बाद भी (जब वहाँ केवल एक ही सूचीबद्ध विधि है)।

आप अलग-अलग परिणाम पर अधिक नियंत्रण की जरूरत है, तो GetInvocationList() का उपयोग करें:

foreach (Func<int> part in func.GetInvocationList()) 
{ 
    int result = part(); 
} 

जो आप प्रत्येक व्यक्ति के परिणाम देखने के लिए अनुमति देता है।

आईएल शब्दावली में:

.class public auto ansi sealed Func<+ TResult> 
    extends System.MulticastDelegate` 

जो कहना है: MulticastDelegate से Func<T> इनहेरिट करती है। असल में, सभी उद्देश्यों और उद्देश्यों के लिए, सभी .NET में प्रतिनिधि मल्टीकास्ट प्रतिनिधि हैं। आप प्रबंधित C++ में गैर-मल्टीकास्ट प्रतिनिधि प्राप्त करने में सक्षम हो सकते हैं, मुझे नहीं पता। लेकिन निश्चित रूप से सी # से नहीं।

+0

ईइक। क्या यह हमेशा इस तरह से काम करता था? मैं चीजों की कल्पना कर सकता हूं ... – Jon

+0

@ जोन स्मृति से, यह शायद .NET 1.0 और .NET 1.1 –

+0

के बीच बड़े बदलावों में से एक हो सकता है धन्यवाद ... इससे मदद मिली है ... – samj28

5

निम्नलिखित उत्तर वास्तव में गलत है, क्योंकि वर्तमान में आप * गैर-शून्य रिटर्न प्रकार वाले मल्टीकास्ट प्रतिनिधि हैं (जूरी अभी भी इस बारे में बाहर है कि यह हमेशा ऐसा रहा है या नहीं)। हालांकि, यह सवाल का जवाब देता है "एक भाषा ऐसे प्रतिनिधियों को क्यों अस्वीकार कर सकती है?", इसलिए मैं इसे पूर्णता के लिए छोड़ रहा हूं।

अब जाएं और मार्क को ऊपर उठाएं।


क्योंकि विभिन्न तरीकों से अधिक मान वापसी होगी, तो क्या प्रतिनिधि से एक वापसी मान तो होना चाहिए? जाहिर है कि कोई जवाब नहीं है जो सभी परिस्थितियों में संतोषजनक होगा। आप तर्क दे सकते हैं कि बहुस्त्र्पीय प्रतिनिधि चाहिए:

  • वापसी मंगलाचरण क्रम में पहली विधि के मूल्य (लेकिन IIRC मंगलाचरण आदेश अनिर्दिष्ट है, तो कैसे होगा यह काम?)
  • वापसी पिछले विधि का मान , जैसा ऊपर
  • सभी प्रतिनिधियों द्वारा लौटाया गया एक अलग मूल्य लौटाता है; अगर वे सभी सहमत नहीं हैं तो
+0

यह ध्यान दिया जाना चाहिए कि * .NET में सभी * प्रतिनिधि बहु-कलाकार प्रतिनिधि हैं। –

+0

@ डैनियल हिल्गार्थ: क्या आप कक्षा के नाम और कार्यक्षमता का समर्थन करते हैं? यदि ऐसा है, तो तकनीकी रूप से आप सही हैं लेकिन "सभी प्रतिनिधि मल्टीकास्ट हैं" गलत इंप्रेशन छोड़ देता है। जाहिर है आप * गैर-शून्य वापसी प्रकार वाले प्रतिनिधियों के पास हो सकते हैं, और इसे आपके बयान के साथ सुलझाने की जरूरत है। – Jon

+0

मार्क द्वारा जवाब देखें। यही वही है जो मेरा मतलब था। –

2

बहुस्त्र्पीय में समस्या यह है कि यह सब मूल्यों को भी पार अभी पिछले विधि मूल्य प्रिंट अगर यह वापसी प्रकार है, तो आप एक के बाद एक की वापसी प्रकार कब्जा करने के लिए है, की सुविधा देता है नीचे दिए गए कोड को देखने के

class Program 
{ 
    // i am going to add and subtract two num but i wanna get result in string the same thing you can do for int and what ever you want 
     delegate string mydeledagte(int a,int b); 
     delegate string d(int s, int t); 
    static void Main(string[] args) 
    { 
     mydeledagte ab = new mydeledagte(ad); 
     mydeledagte d= new mydeledagte(sub); 
     mydeledagte multi = ab + d; 

     foreach (mydeledagte individualMI in multi.GetInvocationList()) 
     { 
      string retVal = individualMI(3, 5); 
      Console.WriteLine("Output: " + retVal); 
      Console.WriteLine("\n***developer of KUST***"); 
      Console.ReadKey(); 
     } 
    } 
    static string ad(int a, int b) 
    { 

     return (a + b).ToString(); 

    } 
    static string sub(int a, int b) 
    { 

     return (a - b).ToString(); ; 
    } 
}