если честно (часть этого вопроса) here , но теперь у меня есть другой вопрос.Ковариация бьет бетонный тип?
public class Base
{
public void Foo(IEnumerable<string> strings) { }
}
public class Child : Base
{
public void Foo(IEnumerable<object> objects) { }
}
List<string> lst = new List<string>();
lst.Add("aaa");
Child c = new Child();
c.Foo(lst);
(п C# 3 будет позвонить: Base.Foo
в C# 4 будет позвонить: Child.Foo
)
Im в FW4! , Позволяет говорить об этом
при всем уважении к ковариации: , когда я пишу c.Foo(lst);
-
видит как подписи !!! (lst
это IEnumerable
СТРОКИ!) но STILL - он выбирает IEnumerable<object>
??
Ковариантность сильнее, чем конкретный тип?
Вы можете заставить его выбрать один из методов, назначив подпись. 'c.Foo ((IEnumerable) lst)' в вашей ситуации ни одна подпись не соответствует реальному конкретному типу, поэтому вы не должны делать никаких предположений. (Ответ ниже дает обоснование из спецификации для выбора, который, по-видимому, отличается от 3.0, но в этих серых областях я предпочитаю просто явно определять поведение с литой) –
@jamietre, нет, это не работает. Ваш код все равно вызовет метод из 'Child'. – svick
Ну, ты просто разрушил весь мой мир! Конечно. Похоже, что «набор методов кандидата» уменьшен до того, как будут устранены различия. –