При исследовании того, как работает ключевое слово C#, я наткнулся на какое-то странное поведение. Это почти похоже на ошибку, но, скорее всего, есть причина для поведения.Weird C# динамическое поведение
В приведенном ниже коде есть два вызова: один для obj1 и один для obj2, но только один из них выполняется правильно. Похоже, что причиной является локальный тип переменной, но «Hello» также должен быть доступен из IDynamicTarget, поскольку он расширяет 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"
}
}
}
Кажется, работает на Mono: http://ideone.com/PGn3Jp. Вот версия, которая терпит неудачу .Net Fiddle: https://dotnetfiddle.net/55ZMAG – Kobi
Это одна черта ошибки, которая игнорируется в течение пяти лет. –
BTW - ошибка с низким приоритетом, потому что если аргумент компилируется, набрал время, тот же код в этом вопросе будет работать. Я чувствую, что есть несколько случаев, когда вы даете динамический аргумент ... –