En C#, ¿alguien sabe por qué no puedo hacer lo siguiente? (Específicamente la línea marcada 'NO bien!' A continuación)¿Por qué falla el enlace dinámico cuando se usa la herencia de la interfaz?
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!
}
}
tengo absolutamente ningún problema si no está vinculado dinámicamente la llamada, o si yo echo de forma explícita a la interfaz en la raíz de la jerarquía, pero la llamada con destino dinámicamente me da:
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
Por cierto, la última llamada falla, incluso sin una herencia de diamante. –
@YuriyGuts: tanto para un ejemplo compilable mínimo eh? :) Ok, simplificando la pregunta en ese caso. –
+1 - También podría ser bueno tener en cuenta que 'b.Add ((int) x)' funciona. –