Pourquoi la liaison dynamique échoue-t-elle lorsqu'on utilise l'héritage d'interface?

En C#, veuillez quelqu'un sait pourquoi je ne peux pas faire la suite? (spécifiquement la ligne marquée " pas bien!"ci-dessous)

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!
    }
}

je n'ai absolument aucun problème si l'appel n'est pas dynamiquement lié, ou si je convertir explicitement à l'interface à la racine de la hiérarchie, mais la dynamique lié appel me donne:

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
25
demandé sur Martijn Pieters 2012-03-10 21:47:37
la source

2 ответов

12
répondu Luke Forder 2012-03-11 01:07:43
la source

il semble que les multiples couches d'héritage d'interface se produisent dans le passage d'une variable de type dynamique. C'est vraiment en train de trébucher sur la fixation du temps de course.

à ce point si vous cherchez à le faire fonctionner une solution possible est:

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

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

puisque la dynamique est vue comme un objet par L'IL, donc tout lancer explicitement pour taper un objet fera en sorte que cela fonctionne pour vous.

0
répondu Brad Rem 2012-03-11 00:43:07
la source

Autres questions sur