C # эквивалент Java < расширяет базу> в дженерики - PullRequest
57 голосов
/ 19 января 2011

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

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

Что является эквивалентом в C # .NET?Ключевого слова ? extends явно нет, и это не работает:

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

Ответы [ 4 ]

92 голосов
/ 12 октября 2011

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

Я нашел страницу MSDN об этом.

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

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

8 голосов
/ 19 января 2011

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

Пример:

IEnumerable<Base> list = new List<SubClass>();
6 голосов
/ 19 января 2011

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

1 голос
/ 29 июля 2015

Если вы ищете дженерики двух типов, посмотрите на это:

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