Есть ли способ достичь ковариации общих типов в C # 3.0? - PullRequest
2 голосов
/ 05 апреля 2010

Это было введено в C # 4.0, но есть ли способ добиться этого в c # 3.0?

Например, рассмотрим следующий код:

class Base
{
}

class Derived1 : Base
{
}

class Derived2 : Base
{
}

class User<T> where T : Base
{
}

class User1 : User<Derived1>
{
}

Теперь я хотел бы иметь список User<T>, в котором я могу хранить User<Derived1>, а также User<Derived2>, но следующий код не компилируется в C # 3.0:

List<User<Base>> users = new List<User<Base>>();
users.Add(new User1());

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 05 апреля 2010

Мало того, что нет хорошего обходного пути, но ваш код также не будет работать в C # 4.0 - только интерфейсы и делегаты поддерживают дисперсию, поэтому вы никогда не сможете обработать User<Derived> как User<Base>.

0 голосов
/ 05 апреля 2010

Самый простой подход, вероятно, состоит в том, чтобы использовать ArrayList или List<object> и обрабатывать кастинг самостоятельно. Нет элегантного способа сделать это в C # 3.

...