सी # में, कृपया किसी को पता है कि मैं निम्नलिखित क्यों नहीं कर सकता? (विशेष रूप से लाइन में चिह्नित 'नहीं ठीक!' नीचे)इंटरफ़ेस विरासत का उपयोग करते समय डायनामिक बाइंडिंग विफल क्यों होती है?
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
वैसे, पिछले कॉल भी एक हीरे की विरासत के बिना विफल रहता है। –
@YuriyGuts: कम से कम संकलित उदाहरण के लिए बहुत कुछ है? :) ठीक है, उस मामले में सवाल को सरल बनाना। –
+1 - यह भी ध्यान रखना अच्छा होगा कि 'बी। जोड़ें ((int) x)' काम करता है। –