С# эквивалент Java <? расширяет Base> в generics
В Java я могу сделать следующее: (предположим Subclass
extends Base
):
ArrayList<? extends Base> aList = new ArrayList<Subclass>();
Что такое эквивалент в С#.NET? Не существует ключевого слова ? extends
, и это не работает:
List<Base> aList = new List<Subclass>();
Ответы
Ответ 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;