2010-08-12 15 views
17

मैं सी # के लिए काफी नया हूं, इसलिए मेरा प्रश्न सरल हो सकता है, लेकिन यहां जाता है।कास्टिंग प्रतिनिधि

मैं प्रतिनिधियों के साथ काम करने की कोशिश कर रहा हूं, और इस समस्या से थोड़ी दूर अटक गया है।

..... 
    public delegate double delegateA(); 
    public delegate double delegateB(); 

    public static double myFunc() 
    { 
     return 0; 
    } 
    public static delegateA myTest() 
    { 
     return myFunc; 
    } 

    static void Main(string[] args) 
    { 
     delegateB myFuncDelegate; 

     myFuncDelegate = myTest(); // <-- Error: Cannot implicitly convert type.... 
    } 
..... 

मुझे नहीं पता कि यह रूपांतरण कार्य कैसे करें, जब तक कि एक ही प्रतिनिधि को प्रकार के रूप में उपयोग न किया जाए। लेकिन मेरी परियोजना में, यह प्रतिनिधि के अलग-अलग नाम के लिए के लिए और अधिक सुंदर हो जाएगा (के रूप में वे विभिन्न वर्गों में मौजूद हैं।

आशा है। क्या आप मेरी मदद कर सकते हैं

+0

सी # का कौन सा संस्करण आप उपयोग कर रहे हैं? आपके कोड का एक आधुनिक विविधता 'Func ' होगा। – Kobi

उत्तर

21

आप प्रतिनिधियों के बीच परिवर्तित नहीं कर सकते कि सीधे की तरह । क्या आप कर सकते हैं है एक नई प्रतिनिधि एक मौजूदा, संगत एक से बना है इसलिए यदि आप करने के लिए अपने कोड बदलने के लिए:।।

delegateB myFuncDelegate = new delegateB(myTest()); 

कि काम करेंगे (ध्यान दें कि "संगतता" जरूरी नहीं है मतलब है कि हस्ताक्षरकर्ता es समान हैं - विवरण के लिए भाषा विनिर्देश देखें।)

बस इसे अन्य पाठकों के लिए थोड़ा स्पष्ट बनाने के लिए, यहां एक सरल पूर्ण उदाहरण है, जिसे किसी भी विधि कॉल की आवश्यकता नहीं है।

// Two delegate types with the same signature 
delegate void Foo(); 
delegate void Bar(); 

class Test 
{ 
    static void Main() 
    { 
     // Actual value is irrelevant here 
     Foo foo = null; 

     // Error: can't convert like this 
     // Bar bar = foo; 

     // This works fine 
     Bar bar = new Bar(foo); 
    } 
} 

नोट वहाँ एक अपवाद के इस "कोई रूपांतरण" शासन के लिए है कि - सी # 4 आप कर सकते हैं लिखने में सी # 4 में सामान्य विचरण उदाहरण के लिए,:

Action<object> foo = x => Console.WriteLine(x.GetHashCode()); 
Action<string> bar = foo; 

... क्योंकि Action<T>contravariantT में है (इसलिए इसे वास्तव में Action<in T> के रूप में घोषित किया गया है)। यह संदर्भ रूपांतरण है - यह नया पहला नमूना जैसा प्रतिनिधि नहीं बनाता है। हालांकि, यह केवल "संगत" प्रतिनिधियों के लिए उपलब्ध नहीं है - केवल सामान्य।

+0

यह काम किया! :-) आपकी सहायता के लिए धन्यवाद। – JakobJ

+1

ध्यान दें कि यह एक प्रतिनिधि का उत्पादन करता है जिसका लक्ष्य पहले प्रतिनिधि का आमंत्रण विधि है, जो संकेत नहीं हो सकता है। Http://stackoverflow.com/a/9290684/497397 और आस-पास की चर्चा देखें कि एक नया प्रतिनिधि कैसे प्राप्त करें जो सीधे मूल लक्ष्य को संदर्भित करता है। –

5

इसके अलावा, वास्तव में क्या नहीं आप के बारे में पूछा, लेकिन दिलचस्प है - यह काम नहीं करता:

Func<double> func_double =() => 1; 
Func<object> func_object; 

func_object = func_double; 

लेकिन इस करता है:

Func<string> func_string =() => "hello"; 
Func<object> func_object; 

func_object = func_string; 

अंतर संदर्भ प्रकार उपयोग कर रहा है स्ट्रिंग उदाहरण है जो किसी ऑब्जेक्ट पर जा सकता है, जबकि डबल को बॉक्स किया जाना चाहिए जिससे डायरेक्ट कास्ट

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