Это возможно, если использовать
ковариантность.
Но с ограничениями:
Во-первых, это возможно только в VS2010, компилятор 2008ой этого не поддерживает. Требования к фреймворку уточните на msdn, на сколько я помню 3.5 sp1 поддерживается, хотя я могу и ошибаться, и для ковариантности требуется .net 4.
Во-вторых, невозможно будет параметризовать класс типами-значениями(например int'ом).
Плюс ковариантность налагает некоторые другие ограничения, о которых вы можете прочитать по ссылке на msdn выше.
Пример кода:
Copy Source | Copy HTML
- public interface IValue<out T>
- {
- T Get();
- }
-
- public class Value<T>:IValue<T>
- {
- public T Get()
- {
- return default(T);
- }
- }
-
- public class Values: List<IValue<object>>
- {
-
- }
Пример использования:
Copy Source | Copy HTML
- var v = new Values();
- v.Add(new Value<string>());
- v.Add(new Value<object>());
-
- //а вот так нельзя: v.Add(new Value<int>());
-