2012-03-10 12 views
25

सी # में, कृपया किसी को पता है कि मैं निम्नलिखित क्यों नहीं कर सकता? (विशेष रूप से लाइन में चिह्नित 'नहीं ठीक!' नीचे)इंटरफ़ेस विरासत का उपयोग करते समय डायनामिक बाइंडिंग विफल क्यों होती है?

interface A 
{ 
    void Add(dynamic entity); 
} 

interface B : A {} 

class C : B 
{ 
    public void Add(dynamic entity) 
    { 
     System.Console.WriteLine(entity); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     B b = new C(); 
     dynamic x = 23; 
     b.Add(23);  // fine 
     b.Add((int)x); // fine 
     (b as A).Add(x); // fine 
     //b.Add(x);  // NOT fine! 
    } 
} 

मैं बिल्कुल कोई समस्या नहीं है, तो कॉल डायनामिक रूप से बाध्य नहीं है है, या अगर मैं स्पष्ट रूप से पदानुक्रम की जड़ में इंटरफ़ेस के लिए डाली है, लेकिन गतिशील रूप से बाध्य कॉल मुझे देता है:

Unhandled Exception: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: No overload for method 'Add' takes '1' arguments 
    at CallSite.Target(Closure , CallSite , B , Object) 
    at System.Dynamic.UpdateDelegates.UpdateAndExecuteVoid2[T0,T1](CallSite site, T0 arg0, T1 arg1) 
    at Program.Main(String[] args) in C:\Users\Stuart\Documents\Visual Studio 2010\Projects\CSharp Testbed\Program.cs:line 218 
+1

वैसे, पिछले कॉल भी एक हीरे की विरासत के बिना विफल रहता है। –

+0

@YuriyGuts: कम से कम संकलित उदाहरण के लिए बहुत कुछ है? :) ठीक है, उस मामले में सवाल को सरल बनाना। –

+1

+1 - यह भी ध्यान रखना अच्छा होगा कि 'बी। जोड़ें ((int) x)' काम करता है। –

उत्तर

0

ऐसा लगता है कि इंटरफ़ेस विरासत की कई परतें गतिशील प्रकार चर के पारित होने में कर रही हैं। यह निश्चित रूप से रन टाइम बाध्यकारी tripping है।

इस बिंदु पर आप इसे एक संभावित समाधान, काम करने के लिए प्राप्त करने के लिए देख रहे हैं है:

dynamic x = 23; 
b.Add((object)x); 

dynamic y = "Hello, World!"; 
b.Add((object)y); 

के बाद से गतिशील, आईएल द्वारा वस्तु के रूप में देखा जाता है तो स्पष्ट रूप से सब कुछ कास्टिंग टाइप करने के लिए वस्तु को यह मिल जाएगा आप के लिए काम करता हूं।

+0

मध्यवर्ती कोड के लिए, गतिशील प्रकार वास्तव में टाइप ऑब्जेक्ट के रूप में देखा जाता है। इसलिए, इस मामले के लिए कम से कम, डायनामिक को टाइप ऑब्जेक्ट के रूप में डालें क्योंकि दोनों ओपी क्या करने की कोशिश कर रहे हैं उसके लिए कार्यात्मक रूप से बराबर हैं। –

+3

सवाल यह नहीं है कि इसे कैसे काम किया जाए, सवाल यह है कि यह क्यों काम नहीं करता है। –

+0

@oleksii: हालांकि मैं शुरुआत में इस बात से हैरान था, लेकिन वास्तव में यह काम करता प्रतीत होता है (यहां तक ​​कि जब मैं 'इकाई' के साथ कुछ और दिलचस्प करने के लिए 'सीएड' बदलता हूं)। मेरी समझ यह है कि 'ऑब्जेक्ट' पर कास्ट बाध्यकारी को संकलन-समय पर करने के लिए मजबूर करता है, लेकिन फ़ंक्शन 'इकाई' के भीतर अभी भी गतिशील रूप से टाइप किया गया है। तो यह कॉल को स्थिर रूप से बाध्य करने का एक और तरीका है -> जिस मामले के लिए मैंने कहा "मुझे बिल्कुल कोई समस्या नहीं है"। दुर्भाग्य से, यह अभी भी व्याख्या नहीं करता है कि मुझे गतिशील बाध्यकारी मामले में समस्या क्यों है। –

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

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