2010-05-27 4 views
3

Можно создать дубликат:
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, будет оценено по достоинству.

+0

Чтобы ответить на второй вопрос (поскольку вопрос был закрыт, когда я отвечал): вы можете сделать это, добавив немного базовых классов в базовый класс. 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). –

ответ

4

Eric Lippert answers the first part of you question here.

Что касается второй части вопроса, то для C# и VB.NET была запрошена ковариация возвращаемого типа, однако она еще не была распределена по приоритетам достаточно высокой по сравнению с другими языковыми функциями, чтобы превратить ее в любой выпуск. Если я правильно помню, эта функция также потребует изменений в CLR, которые будут реализованы соответствующим образом.

Что касается того, почему это так, я назову Eric Lippert на мгновение и отвечаю, что не реализация функции бесплатна, а для реализации функций требуется бюджет и время для разработки, разработки, тестирования и документирования. .. который не является бесплатным. Функция должна быть достаточно ценной для достаточного количества людей, чтобы оправдать затраты на ее создание.

+0

Спасибо, прочитайте его сообщение. Я смущен тем, почему общий параметр не может иметь никаких «записываемых» полей/свойств. Есть ли пример того, как это может вызвать проблему? Возвращаясь, чтобы изучить его пример дальше ... –

+2

Не мог бы лучше сказать это. :-) –

+1

@Casey: Предположим, что C ковариантно в T и C имеет метод void M (T t). У вас есть переменная x типа C . Вы конвертируете значение типа C в C и присваиваете его x. Теперь вы можете вызвать x.M (новый Giraffe()), поскольку, насколько известно компилятору, M берет объект, а не тигр.И тогда время выполнения падает, когда он пытается превратить жирафа в тигра. Вот почему в ковариантном типе запрещено иметь T, который идет «в». –