Подтвердить что ты не робот

С# эквивалент Java <? расширяет Base> в generics

В Java я могу сделать следующее: (предположим Subclass extends Base):

ArrayList<? extends Base> aList = new ArrayList<Subclass>();

Что такое эквивалент в С#.NET? Не существует ключевого слова ? extends, и это не работает:

List<Base> aList = new List<Subclass>();
4b9b3361

Ответ 1

На самом деле существует эквивалент (тип), ключевое слово where. Я не знаю, как это "близко". У меня была функция, в которой мне нужно было сделать что-то подобное.

Я нашел msdn page.

Я не знаю, можете ли вы сделать это inline для переменной, но для класса, который вы можете сделать:
public class MyArray<T> where T: someBaseClass
или для функции public T getArrayList<T>(ArrayList<T> arr) where T: someBaseClass

Я не видел его на странице, но с использованием ключевого слова "where" это могло бы быть возможно для переменной.

Ответ 2

Посмотрите Covariance и Contravariance с .Net 4.0. Но он работает только с interfaces прямо сейчас.

Пример:

IEnumerable<Base> list = new List<SubClass>();

Ответ 3

Точного эквивалента нет (так как система типов работает не совсем так: стирание стилей и все), но вы можете получить очень похожую функциональность с помощью in и out, используя ковариация и контравариантность.

Ответ 4

Если вы ищете два типа дженериков, взгляните на это:

    void putAll<K1, V1>(Dictionary<K1,V1> map) where K1 : K where V1 : V;