Можно создать дубликат:
Why isn’t there generic variance for classes in C# 4.0?Почему нет классов в .NET 4 covariant?
В дебютном программиста у меня есть несколько вопросов о дисперсии в .NET 4. Не столько о том, как это работает, но почему некоторые вещи не вариант, и если другие люди посчитают это полезным.
Вопрос 1:
Я знаю, что интерфейсы и делегаты могут быть ковариантны/контравариантен в .NET 4, но почему не классы? Итак, вопрос 1:
List(of BaseClass) = List(of DerivedClass)
Это как-то небезопасно? Разве это не было бы полезно?
Вопрос 2:
Вопрос 2 следует из вопроса 1, но может иметь дело больше с подписями, чем дисперсия. Предположим, у меня есть класс MustInherit с членом MustOverride:
Public MustInherit Class TestBase
Public MustOverride Property SomeClass as BaseClass
End Class
В производном классе, почему я не могу переопределить SomeClass и вернуть Производный класс BaseClass? Это небезопасно? Это просто, что подписи не проверяют отношения наследования?
Public Class TestSpecific
Inherits TestBase
Public Overrides Property SomeClass as DerivedClass
End Class
Любое понимание того, почему это не разрешено в .NET 4, будет оценено по достоинству.
Чтобы ответить на второй вопрос (поскольку вопрос был закрыт, когда я отвечал): вы можете сделать это, добавив немного базовых классов в базовый класс. Java Enums используют это, например, чтобы удостовериться, что 'compareTo' может передавать только значения этого перечисления. См. [Здесь] (http://madbean.com/2004/mb2004-3/) и [здесь] (http://msmvps.com/blogs/jon_skeet/archive/2008/08/20/lessons -learned-from -Протокол-буфера-часть-2-самоссылающийся-родового-types.aspx). –