public interface IDic
{
int Id { get; set; }
string Name { get; set; }
}
public class Client : IDic
{
}
¿Cómo puedo enviar List<Client>
a List<IDic>
?
No puede transmitirlo (conservando la identidad de referencia), eso no sería seguro. Por ejemplo:
public interface IFruit {}
public class Apple : IFruit {}
public class Banana : IFruit {}
...
List<Apple> apples = new List<Apple>();
List<IFruit> fruit = apples; // Fortunately not allowed
fruit.Add(new Banana());
// Eek - it's a banana!
Apple apple = apples[0];
Ahora puede convertir List<Apple>
a IEnumerable<IFruit>
en .NET 4 / C # 4 debido a la covarianza, pero si desea un List<IFruit>
, tendrá que crear una nueva lista. Por ejemplo:
// In .NET 4, using the covariance of IEnumerable<T>
List<IFruit> fruit = apples.ToList<IFruit>();
// In .NET 3.5
List<IFruit> fruit = apples.Cast<IFruit>().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. (Por supuesto, se verán las modificaciones a los objetos a los que se refieren las listas).
List<IFruit>
que en realidad sea una referencia a unList<Apple>
. ¿Qué esperaría que sucediera si agregara unaBanana
referencia a esoList<IFruit>
?using
directiva paraSystem.Linq
, o lo que usted está tratando de llamarlo en adelante, no estoy seguro de cómo se espera que sea capaz de ayuda. Le sugiero que investigue más y, si todavía está atascado, haga una pregunta con un ejemplo mínimo reproducible .Un iterador Cast y .ToList ():
List<IDic> casted = input.Cast<IDic>().ToList()
hará el truco.Al principio 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
ToList()
llamadafuente
Cast
devuelve unIEnumerable<T>
, no unList<T>
- y no, la covarianza no permitirá esta conversión, porque no sería seguro - vea mi respuesta.ToList()
faltaba el antes de leer tu comentario; pero sí, como ha demostrado, ¡la covarianza no funcionará! Doh!Cast
llamada en .NET 4, siempre que especifique el argumento de tipo aToList
.Yo también tuve este problema y, después de leer la respuesta de Jon Skeet, modifiqué mi código de uso
List<T>
a usoIEnumerable<T>
. Aunque esto no responde a la pregunta original de la OP de ¿Cómo puedo enviar contenidoList<Client>
aList<IDic>
, no evita la necesidad de hacerlo y por lo tanto puede ser de utilidad para otros que se encuentran con este problema. Por supuesto, esto supone que el código que requiere el usoList<IDic>
está bajo su control.P.ej:
En vez de:
fuente
Si puede usar LINQ, puede hacer esto ...
fuente
fuente
Solo es posible creando nuevos
List<IDic>
y transfiriendo todos los elementos.fuente
En .Net 3.5, puede hacer lo siguiente:
El constructor de List en este caso toma un IEnumerable. aunque la
lista solo es convertible a IEnumerable. Aunque myObj puede convertirse en ISomeInterface, el tipo IEnumerable no se puede convertir en IEnumerable.
fuente