Я думаю, этот вопрос лучше всего можно понять на примере, так что здесь мы идем:Почему не может быть динамически отправлено выражение с базовым доступом в C#?
public class Base {
// this method works fine
public void MethodA(dynamic input) {
// handle input
}
}
public class Derived: Base { // Derived was named Super in my original post
// This is also fine
public void MethodB(dynamic input) {
MethodA(input);
}
// This method does not compile and the compiler says:
// The call to method 'MethodA' needs to be dynamically dispatched,
// but cannot be because it is part of a base access expression.
// Consider casting the dynamic arguments or eliminating the base access.
public void MethodC(dynamic input) {
base.MethodA(input);
}
}
Компилятор ясно указывает, что метод C является недействительным в связи с тем, что он использует базовый доступ для вызова метода А. Но почему в том, что?
И как можно вызвать базовый метод при переопределении метода с динамическими параметрами?
E.g. что, если я хотел бы сделать:
public class Base {
// this method works fine
public virtual void MethodA(dynamic input) {
Console.WriteLine(input.say);
}
}
public class Derived: Base { // Derived was named Super in my original post
// this does not compile
public override void MethodA(dynamic input) {
//apply some filter on input
base.MethodA(input);
}
}
Ahh, наконец, кто-то, кто может ответить * почему *. Что вы подразумеваете под «Суперклассом»? Я знаю этот термин как синоним «базового класса». –
@Allon: это фрагмент OP. –
@Hans: О, pfff, глупо меня. –