я следующий код, который действительно делает смешной материал:Почему C# вызывает неправильную перегрузку?
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>)
В то время как assinging в Parent
ссылку на c
генерирует правильный вывод:
...
Parent c = new Child();
var list = new List<string> { "Hello", "World!" };
c.DoSomething(list);
...
Печать Child.DoSomething(IEnumerable<string>)
Почему происходит ?!
Ну, я проверил ваш код в VS2008 с помощью модульного теста. И я получаю «Ребенок».DoSomething (IEnumerable) 'в результате в обоих. –
@Draco: он должен работать в .NET 4.0/C# 4.0, чтобы этот эффект вступил в силу, так как 'List' совместим с 'IEnumerable
Я тоже не смог воспроизвести это поведение. VS2010 .NET 4.0 C# и всегда получил «Child.DoSomething (IEnumerable)» в качестве вывода. Вы должны иметь больше кода, чем это, вызывая это поведение. Пожалуйста, разместите свой полный код, и мы сами увидим. –