Durante l'analisi di come funziona la parola chiave dinamica C#, sono incappato in qualche comportamento strano. Sembra quasi un bug, ma probabilmente è più probabile che ci sia una ragione per il comportamento.Comportamento dinamico C# strano
Nel codice sottostante, ci sono due chiamate, una per obj1 e una per obj2, ma solo una di esse viene eseguita correttamente. Sembra che il tipo di variabile locale sia la ragione, ma "Hello" dovrebbe essere accessibile anche da IDynamicTarget, perché estende IDynamicTargetBase.
namespace DynamicTesting
{
interface IDynamicTargetBase
{
string Hello(int a);
}
interface IDynamicTarget : IDynamicTargetBase
{
}
class DynamicTarget : IDynamicTarget
{
public string Hello(int a)
{
return "Hello!";
}
}
class Program
{
static void Main(string[] args)
{
dynamic a = 123;
IDynamicTargetBase obj1 = new DynamicTarget();
obj1.Hello(a); // This works just fine
IDynamicTarget obj2 = new DynamicTarget();
obj2.Hello(a); // RuntimeBinderException "No overload for method 'Hello' takes '1' arguments"
}
}
}
sembra funzionare su Mono: http://ideone.com/PGn3Jp. Ecco una versione che fallisce. Net Fiddle: https://dotnetfiddle.net/55ZMAG – Kobi
Questo è un bizzarro bug da ignorare per cinque anni. –
BTW è un bug a bassa priorità perché se l'argomento è compilato- tempo digitato, lo stesso codice in questa domanda funzionerà. Sento che ci sono pochi casi in cui si dà un argomento dinamico ... –