У меня есть следующий код, который действительно делает забавный материал:
class Parent {
public virtual void DoSomething(IEnumerable<string> list) {
Console.WriteLine("Parent.DoSomething(IEnumerable<string>)");
}
}
class Child : Parent {
public override void DoSomething(IEnumerable<string> list) {
Console.WriteLine("Child.DoSomething(IEnumerable<string>)");
}
public void DoSomething(IEnumerable<object> list) {
Console.WriteLine("Child.DoSomething(IEnumerable<object>)");
}
}
Как видите, метод DoSomething
в Child
переопределяетсяправильно.
Вывод следующего кода очень неожиданный:
...
Child c = new Child();
var list = new List<string> { "Hello", "World!" };
c.DoSomething(list);
...
Печать Child.DoSomething(IEnumerable<object>)
В то время как при Parent
ссылке на c
генерируетсяправильный вывод:
...
Parent c = new Child();
var list = new List<string> { "Hello", "World!" };
c.DoSomething(list);
...
Печать Child.DoSomething(IEnumerable<string>)
Почему это происходит ?!