У меня может быть Невведенный Набор в C#

Я портирую некоторый код Java на C#, и я натыкался на это:

List<?>

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

Что фундаментальное эквивалентно в C#?

9
задан tzenes 12 August 2010 в 00:14
поделиться

6 ответов

I think the best match to Java's List would be C# 4.0 IEnumerable If you have a method that takes List than you can call it with List and List like so:

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 interface is actually IEnumerable, which means that if, say, R derives from T, IEnumerable can be assigned to from IEnumerable.

So, all you have to do is make your doSomething into DoSomething and have accept IEnumerable parameter:

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: If C# 4.0 is not available, you can always fall back to either untyped IEnumerable or IList.

6
ответ дан 4 December 2019 в 13:44
поделиться

Вы можете просто использовать

List

0
ответ дан 4 December 2019 в 13:44
поделиться

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

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

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

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

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

int size2(List<Object> list)
{
    return 2*list.size(); 
}
0
ответ дан 4 December 2019 в 13:44
поделиться

If you want a list that can hold anything, you can use a List or an ArrayList.

If you want a strongly-typed list that holds an unknown type, you should make a generic class or method and use a List.

For more specific advice, please provide more detail.

5
ответ дан 4 December 2019 в 13:44
поделиться

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

1
ответ дан 4 December 2019 в 13:44
поделиться

Firstly, as mentioned elsewhere, the unbounded wildcard parameterized type is not the same as Object. Generics are not covariant. So in the OP's Java example List is not the same as List. As an example,

// 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

The only real use case for List in Java is when interacting with legacy non generic collections. It allows you to avoid unchecked conversion warnings from the compiler.

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

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

3
ответ дан 4 December 2019 в 13:44
поделиться