Как я понимаю, каждый язык может иметь собственный обработчик dynamic
, поэтому применяются соответствующие правила. Я не уверен, что следующее правильно/неверно; мысли?
Сценарий: два интерфейса (один реализует другой) с помощью некоторых методов:
public interface IA {
void Bar(object o);
}
public interface IB : IA {
void Foo(object o);
}
и базовая реализация:
public class B : IB {
public void Foo(object o) { Console.WriteLine("Foo"); }
public void Bar(object o) { Console.WriteLine("Bar"); }
}
Теперь, с обычным С# (no dynamic
), мы можем получить доступ к методам IA
от цели типа IB
:
IB b = new B();
var o = new { y = "z" };
b.Foo(o.y); // fine
b.Bar(o.y); // fine
Теперь преднамеренно добавьте аргументы dynamic
к аргументам, которые заставляют весь вызов использовать обработку dynamic
(так как в общем случае это может повлиять на разрешение перегрузки, хотя этого здесь не будет):
IB b = new B();
dynamic x = new {y = "z"};
b.Foo(x.y); // fine
b.Bar(x.y); // BOOM!
Что не удается с помощью RuntimeBinderException
:
'IB' не содержит определения для "Bar"
Теперь, что он говорит, совершенно правильно, поскольку IB
не имеет метод Bar
. Однако, как показано в первом примере: при нормальных правилах С# ожидается, что, поскольку тип объявления цели является интерфейсом (IB
), другие интерфейсы, которые, как известно, будут реализованы (т.е. IA
), проверяются как часть разрешение перегрузки.
Итак: это ошибка? Или я неправильно его понимаю?