Während ich untersuche, wie C# dynamisches Schlüsselwort funktioniert, stolperte ich über ein seltsames Verhalten. Es sieht fast wie ein Fehler aus, aber wahrscheinlich gibt es einen Grund für das Verhalten.Weird C# dynamisches Verhalten
Im folgenden Code gibt es zwei Aufrufe, einen nach obj1 und einen nach obj2, aber nur einer von ihnen wird korrekt ausgeführt. Es scheint, als wäre der lokale Variablentyp der Grund, aber "Hello" sollte auch von IDynamicTarget aus zugänglich sein, weil es IDynamicTargetBase erweitert.
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"
}
}
}
scheint auf Mono zu arbeiten: http://ideone.com/PGn3Jp. Hier ist eine Version, die auf .Net Fiddle fehlschlägt: https://dotnetfiddle.net/55ZMAG – Kobi
Das ist ein höllischer Fehler, es seit fünf Jahren zu ignorieren .. –
BTW ist ein niedriger Priorität Bug, weil wenn Argument kompiliert wird Zeit eingegeben, der gleiche Code in dieser Frage wird funktionieren. Ich habe das Gefühl, dass es nur wenige Fälle gibt, in denen Sie ein dynamisches Argument geben ... –