2010-08-12 7 views
9

estoy portar algo de código Java a C# y me encontré con esto:¿Puedo tener una colección sin tipo en C#

List<?> 

Según entiendo que este es un tipo de ListUnknown. Como resultado, puedo dictar el tipo en otro lugar (¿en tiempo de ejecución? No estoy seguro).

¿Cuál es el equivalente fundamental en C#?

+1

La pregunta es; ¿Es realmente una buena idea, o estarías mejor con seguridad tipo? –

+5

La lista no es una respuesta relevante. si un método acepta el parámetro List , puede aceptar todos los tipos de lista como List , List . Si el parámetro es List , no funcionará. – irreputable

+0

Sería bueno tener algún contexto ... ¿dónde y para qué se usa esta declaración? –

Respuesta

6

creo que el mejor partido a Java de List<?> sería C# 4.0 IEnumerable<out T> Si usted tiene un método que toma List<?> de lo que puede llamar con List<Object> y List<String> así:

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> interfaz es realmente IEnumerable<out T>, lo que significa que si, por ejemplo, R deriva de T, se puede asignar IEnumerable<T> desde IEnumerable<R>.

Por lo tanto, todo lo que tiene que hacer es hacer que su doSomething en DoSomething y tienen aceptar IEnumerable<T> parámetro:

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: Si C# 4.0 no está disponible, siempre se puede caer de nuevo a cualquiera sin tipo IEnumerable o IList.

+0

C# 4.0 usa la varianza del sitio de declaración, mientras que Java es el sitio de uso. Use-site tiene más sentido donde las interfaces de "lectura-escritura" son comunes. –

5

Si desea una lista que pueda contener cualquier cosa, puede usar un List<object> o un ArrayList.

Si desea una lista fuertemente tipada que tenga un tipo desconocido, debe hacer una clase o método genérico y usar un List<T>.

Para obtener más información específica, proporcione más detalles.

+0

La lista no es un tipo desconocido. Es tipo T.? en java es algo diferente. – serg10

+0

@Serg: Es por eso que dije ** Si **. – SLaks

0

Se podía utilizar

List<object>

+1

Esto no funciona. 'Lista ' no es equivalente a 'Lista de Java ', que es una implementación de contravarianza, que C# 4 todavía no es compatible (sólo para las interfaces y delegados) –

0

Creo que el interlocutor quiere convertir algo como esto

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

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

en C# equivalentes.

El siguiente código no funcionará, ya que sólo aceptan List<Object>, no List<Foo>

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

En su escenario Esto va a trabajar: int tamaño 2 (Lista list) { return 2 * list.Count; } –

1

Parece que IList es lo que estás buscando. Es una interfaz genérica para las listas, lo que significa que tendrá que emitir cualquier cosa que sale y tener cuidado con lo que pones en.

3

En primer lugar, como se ha mencionado en otro lugar, el tipo parametrizado comodín sin límites no es el mismo que el objeto. Los genéricos no son covariantes. Por lo tanto, en el ejemplo Java de OP, List<?> no es lo mismo que List<Object>.A modo de ejemplo,

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

El único caso de uso real para List<?> en Java es la hora de interactuar con el legado colecciones no genéricas. Le permite evitar las advertencias unchecked conversion del compilador.

C# no tiene este caso de uso. Los genéricos C# no se implementaron mediante borrado. No existe compatibilidad hacia atrás entre las colecciones genéricas y no genéricas en .net, que coexisten en las bibliotecas .net centrales. Eso es diferente de Java donde la versión genérica de la API de colecciones reemplazó la versión no genérica en JDK 1.5.

Así que no creo que haya una razón para querer este constructo en C#, y no existe un equivalente directo que se comporte de la misma manera.

Cuestiones relacionadas