Я портирую некоторый код Java на C#, и я натыкался на это:
List<?>
Насколько я понимаю это - a List
из типа Unknown
. В результате я могу продиктовать тип в другом месте (во времени выполнения? Я не уверен).
Что фундаментальное эквивалентно в C#?
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
.
Я думаю, что задающий вопрос хочет преобразовать что-то вроде этого
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();
}
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.
Похоже, IList
- это то, что вы ищете. Это общий интерфейс для списков, а это значит, что вам придется преобразовывать все, что выходит, и внимательно следить за тем, что вы вставляете.
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#, и нет прямого эквивалента, который вел бы себя так же.