Cast List a List

public interface IDic { int Id { get; set; } string Name { get; set; } } public class Client : IDic { } 

¿Cómo puedo List List en List ?

No puedes lanzarlo (preservando la identidad de referencia), eso sería inseguro. Por ejemplo:

 public interface IFruit {} public class Apple : IFruit {} public class Banana : IFruit {} ... List apples = new List(); List fruit = apples; // Fortunately not allowed fruit.Add(new Banana()); // Eek - it's a banana! Apple apple = apples[0]; 

Ahora puede convertir una List en un IEnumerable en .NET 4 / C # 4 debido a la covarianza, pero si desea una List , deberá crear una nueva lista. Por ejemplo:

 // In .NET 4, using the covariance of IEnumerable List fruit = apples.ToList(); // In .NET 3.5 List fruit = apples.Cast().ToList(); 

Pero esto no es lo mismo que lanzar la lista original, porque ahora hay dos listas separadas . Esto es seguro, pero debe comprender que los cambios realizados en una lista no se verán en la otra lista. (Por supuesto, se verán las modificaciones a los objetos a los que se refieren las listas).

Un iterador de Cast y .ToList ():

List casted = input.Cast().ToList() hará el truco.

Originalmente, dije que la covarianza funcionaría, pero como Jon ha señalado correctamente; no, no lo hará!

Y originalmente también dejé estúpidamente la llamada ToList()

Yo también tuve este problema y después de leer la respuesta de Jon Skeet modifiqué mi código de usar List para usar IEnumerable . Aunque esto no responde a la pregunta original de OP sobre ¿Cómo puedo List List en List , evita la necesidad de hacerlo y, por lo tanto, puede ser útil para otras personas que encuentran este problema. Por supuesto, esto supone que el código que requiere el uso de List está bajo su control.

P.ej:

 public void ProcessIDic(IEnumerable sequence) { // Implementation } 

En lugar de:

 public void ProcessIDic(List list) { // Implementation } 

Si puede usar LINQ, puede hacer esto …

 List clientList = new List(); List list = clientList.Select(c => (IDic)c).ToList(); 
 List listOfA = new List(); List list = listOfA.Cast().ToList(); 

Solo es posible creando una nueva List y transfiriendo todos los elementos.

En .Net 3.5, puede hacer lo siguiente:

 List interfaceList = new List(list.Cast()); 

El constructor de List en este caso toma un IEnumerable.
aunque la lista solo es convertible a IEnumerable. Aunque myObj puede ser convertible a ISomeInterface, el tipo IEnumerable no es convertible a IEnumerable.