2010-05-06 16 views
5
public class Program 
{ 
    delegate void Srini(string param); 

    static void Main(string[] args) 
    { 
     Srini sr = new Srini(PrintHello1); 
     sr += new Srini(PrintHello2);  //case 2:  
     sr += new Srini(delegate(string o) { Console.WriteLine(o); }); 
     sr += new Srini(delegate(object o) { Console.WriteLine(o.ToString()); }); //case 4: 
     sr += new Srini(delegate { Console.WriteLine(“This line is accepted,though the method signature is not Comp”); });//case 5 
     sr("Hello World"); 
     Console.Read(); 
    }  

    static void PrintHello1(string param) 
    { 
     Console.WriteLine(param); 
    } 

    static void PrintHello2(object param) 
    { 
     Console.WriteLine(param); 
    } 
} 

कंपाइलर मामले 2 के बारे में शिकायत नहीं करता है (टिप्पणी देखें), अच्छी तरह से कारण स्ट्रिंग ऑब्जेक्ट से विरासत प्राप्त करने के कारण सीधे आगे है। उसी तर्ज पर, यह क्यों गुमनाम विधि प्रकार के लिए शिकायत कर रहा है (टिप्पणी // मामले 4 :) किकम विशिष्ट पैरामीटर प्रकार

को सौंपने के लिए प्रकार 'DelegateTest.Program.Srini' क्योंकि पैरामीटर प्रकार नहीं है गुमनाम विधि कनवर्ट नहीं कर सकता देखना प्रतिनिधि पैरामीटर प्रकारों से मेल करें

जहां सामान्य विधि के मामले में यह नहीं है? या मैं संतरे के साथ सेब की तुलना कर रहा हूँ? एक और मामला यह है कि यह पैरामीटर के बिना अज्ञात विधि क्यों स्वीकार कर रहा है?

उत्तर

7

विधि समूह रूपांतरण भिन्नता का समर्थन करते हैं (सी # 2 के रूप में - वे सी # 1 में नहीं थे), अज्ञात फ़ंक्शन रूपांतरण बस नहीं करते हैं। यह देखते हुए कि जब भी आप एक अनाम कार्य लिखते हैं तो आप उचित पैरामीटर लिख सकते हैं, ऐसा क्यों न करें? जहां तक ​​मैं देख सकता हूं वहां भिन्नता की इजाजत देने में कोई फायदा नहीं होगा, और यह नियमों को सही करने के लिए कठिन बना देगा। (भिन्नता spec में बहुत जटिल होने के समाप्त होता है।)

संपादित करें: पैरामीटर सूची के बिना एक अज्ञात विधि मूल रूप से किसी भी प्रतिनिधि की पैरामीटर सूची के साथ संगत है, क्योंकि इसमें out पैरामीटर नहीं हैं। असल में यह कहने का एक तरीका है, "मुझे पैरामीटर की परवाह नहीं है।" यह एक लैम्बडा अभिव्यक्तियों के अज्ञात तरीकों की सुविधा नहीं है :)

+0

ओप्स जोन, यह एक टाइपो है; यह बिना है। मैं // केस 5 का जिक्र कर रहा हूं। मैंने सवाल संपादित किया है। –

+0

@ श्रीनिवास: ठीक है, मैंने उचित जवाब संपादित किया है। –

संबंधित मुद्दे