Нет, ваша интуиция неверна. Это не должно работать, потому что универсальные классы не являются вариантами в .NET.
То, что TItemType
наследуется от AccountingItemBase
, не означает, что AccountingBase<TItemType>
наследуется от AccountingBase<AccountingItemBase>
. Предположим, что AccountingBase<TItemType>
имеет поле типа TItemType
. Тогда, если ваша интуиция была правильной, вы могли бы написать:
AccountingBase<SomeSubtype> x = new AccountingBase<SomeSubtype>();
AccountingBase<AccountingItemBase> y = x;
y.SomeField = new OtherSubtype();
Это явно нарушит безопасность типов, потому что если рассматривать это как AccountingBase<SomeSubtype>
, поле должно иметь тип SomeSubtype
, но вы поместили туда значение типа OtherSubtype
!
По сути, общая дисперсия - сложная тема.
Я предлагаю вам прочитать длинный и подробный пост в блоге Эрика Липперта для получения дополнительной информации. Или у меня есть видео с NDC 2010 , которое может оказаться полезным. В основном в .NET 4 есть некоторая общая дисперсия, но она ограничена.
Теперь, что вы можете сделать в вашей ситуации:
- Вы можете создать неуниверсальный базовый класс, от которого наследуется
AccountingBase
. Это, наверное, лучшая идея. Затем сделайте тип свойства Parent
неуниверсальным типом.
- Вы можете сделать
AccountingBase
родовым как для себя, так и для его родителя ... но это в конечном итоге приведет к проблемам рекурсии, эффективно ...