2010-08-12 5 views
9

Я портирование некоторых Java-кода на C#, и я натыкался на это:Могу ли я иметь без типа коллекции в C#

List<?> 

Как я понимаю, что это List типа Unknown. В результате я могу диктовать тип в другом месте (во время выполнения? Я не уверен).

Что является основным эквивалентом в C#?

+1

Вопрос в том, это действительно хорошая идея, или вам будет лучше с безопасностью типа? –

+5

Список не является подходящим ответом. если метод принимает параметр List , он может принимать все типы списка, такие как List , List . Если параметром является List , он не будет работать. – irreputable

+0

Было бы неплохо иметь какой-то контекст ... где и для чего используется это заявление? –

ответ

6

Я думаю, что лучший матч в Java List<?> будет C# 4.0 IEnumerable<out T> Если у вас есть метод, который принимает List<?>, чем вы можно назвать с List<Object> и List<String> так:

List<Object> objList = new List<Object>(); 
List<String> strList = new List<String>(); 

doSomething(objList); //OK 
doSomething(strList); //OK 

public void doSomething(List<?> theList) { 
///Iterate through list 
} 

C# 4.0 IEnumerable<T> интерфейс на самом деле IEnumerable<out T>, что означает, что, если, скажем, R происходит от T, IEnumerable<T> может быть от IEnumerable<R>.

Таким образом, все, что вам нужно сделать, это сделать свой doSomething в DoSomething и есть принять IEnumerable<T> параметр:

List<Object> objList = new List<Object>(); 
List<String> strList = new List<String>(); 

DoSomething(objList); //OK 
DoSomething(strList); //OK 

public void DoSomething<T>(IEnumerable<T> theList) { 
///Iterate through list 
} 

EDIT: Если C# 4.0 не доступен, вы всегда можете упасть обратно либо нетипизированным IEnumerable или IList.

+0

В C# 4.0 используется дисперсия объявления-сайта, тогда как Java - это сайт-сайт. Использование сайта имеет больше смысла, когда интерфейсы «чтение-запись» являются общими. –

5

Если вам нужен список, который может содержать что-либо, вы можете использовать List<object> или ArrayList.

Если вам нужен строго типизированный список, который содержит неизвестный тип, вы должны сделать общий класс или метод и использовать List<T>.

Для более конкретных консультаций, пожалуйста, предоставьте более подробную информацию.

+0

Список не является неизвестным типом. Это тип Т. в java что-то другое. – serg10

+0

@Serg: Вот почему я сказал ** Если **. – SLaks

0

Вы могли бы просто использовать

List<object>

+1

Это не работает. 'Список ' не эквивалентно 'Список Явы ', который является реализацией контрвариации, что C# 4 еще не поддерживает (только для интерфейсов и делегатов) –

0

Я думаю, что спрашивающий хочет преобразовать что-то вроде этого

int size2(List<?> list) 
{ 
    return 2*list.size(); 
} 

List<Foo> list = ... 
size2(list); 

в C# эквивалент.

Следующий код не будет работать, потому что он только принимает List<Object>, не List<Foo>

int size2(List<Object> list) 
{ 
    return 2*list.size(); 
} 
+0

В вашем случае это будет работать: Int size2 (Список ) { возвращение 2 * список. } –

1

Похоже, что IList - это то, что вы ищете. Это общий интерфейс для списков, то есть вы должны бросить все, что приходит и быть осторожным, что вы положили в.

3

Во-первых, как уже упоминалось в другом месте, неограниченная подстановочные параметризованный тип не такой же, как объект. Дженерики не ковариантны. Таким образом, в примере Java OP List<?> это не то же самое, что и List<Object>.В качестве примера,

// Unbounded wildcard type is not the same as Object... 
List<?> unboundedList = new ArrayList<Object>(); 
List<Object> objectList = new ArrayList<Object>(); 
unboundedList = objectList; // no problems 
objectList = unboundedList; // whoops! compile time error 

Единственный реальный случай использования для List<?> в Java является при взаимодействии со старыми, не являющихся родовыми коллекциями. Это позволяет избежать предупреждения unchecked conversion от компилятора.

C# не имеет этого варианта использования. C# generics не были реализованы с использованием стирания. Не существует обратной совместимости между коллекциями generic и non-generic в .net - они сосуществуют в основных библиотеках .net. Это отличается от Java, где общая версия коллекций api заменила не общую версию на JDK 1.5.

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

Смежные вопросы