Pourquoi la liaison dynamic échoue-t-elle lors de l’utilisation de l’inheritance d’interface?

En C #, s’il vous plaît, est-ce que quelqu’un sait pourquoi je ne peux pas faire ce qui suit? (en particulier 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(ssortingng[] 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 lié de manière dynamic ou si j’ai explicitement converti vers l’interface située à la racine de la hiérarchie, mais l’appel lié de manière dynamic 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(Ssortingng[] args) in C:\Users\Stuart\Documents\Visual Studio 2010\Projects\CSharp Testbed\Program.cs:line 218 

Rechercher dans Microsoft Connect est classé comme un bogue – Le moteur d’exécution dynamic ne parvient pas à trouver une méthode à partir d’une interface de base pendant l’exécution

Il semble que les multiples couches d’inheritance d’interface se produisent lors du passage d’une variable de type dynamic. Cela déclenche définitivement la liaison du temps d’exécution.

À ce stade, si vous souhaitez le faire fonctionner, une solution de contournement est la suivante:

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

Étant donné que dynamic est considéré comme un object par l’IL, le fait de tout définir explicitement pour taper object fera en sorte que cela fonctionne pour vous.