Аноним
Зарегистрирован: 18 February 2005
Сообщения: 13860
Примеры кода: 0
|
Как бороть отсутствие variance для генериков? |
31 January 2007 17:40 |
|
|
|
|
Камрады, кто что думает о такой ситуации:
Есть интерфейсы:
interface IThis {}
interface IThis2 : IThis {}
interface IThis3 : IThis2 {} // ну и т.д.
interface IThese<T> where T : IThis
{
// ...
IThese<IThis> AsBase { get; }
// ...
}
Хочется иметь класс, реализующий IThese<T>, типа такого:
class These<T> : IThese<T> where T : IThis
{
// ...
public IThese<IThis> AsBase { get { return this; }}
// ...
}
Получаем ошибку при компиляции, причем заботливо подсказывается, что де "An explicit conversion exists (are you missing a cast?)". Ежели применить это самое "explicit conversion" и записать свойство These<T>.AsBase так
public IThese<IThis> AsBase { get { return (IThese<IThis>) this; } }
то получим InvalidCastException в рантайме:
Unable to cast object of type 'These`1[...+IThis3]' to type 'IThese`1[...+IThis]'
Если же записать
class These<T> : IThese<T>, IThese<IThis> where T : IThis
то совершенно справедливо получим по рукам от компилятора за то, что
... cannot implement both '... .These<T>' and '... .IThese<... .IThis>' because they may unify for some type parameter substitutions
Городить отдельную реализацию интерфейса IThese<IThis>, которая особо ничем не отличается от IThese<T> where T : IThis? Определить негенерик-интерфейс типа IThese, фактически, копию IThese<T>, и реализовывать в классе These этот интерфейс? Что будет идеологически более правильно? (в MSDN просьба не посылать, там был, соответствующую статью на эту тему читал, но в реальном случае писать "враппер" как-то того... некрасиво, ибо IThese<T> может содержать много методов и свойств) :xz:
Спасибо за внимание.
Данное сообщение получено с сайта RSDN
|
|