Pregunta

Todo se hereda de object.Es la base de la herencia.Todo lo que se puede convertir implícitamente el árbol de herencia, es decir,.

object me = new Person();

Por lo tanto, siguiendo este hasta su conclusión lógica, un grupo de Personas también sería un grupo de objetos:

List<Person> people = new List<Person>();
people.Add(me);
people.Add(you);
List<object> things = people; // Ooops.

Excepto, que no funciona, la gente que diseñó .NETA ya sea pasado por alto esto, o hay una razón, y no estoy seguro de qué.Al menos una vez se han topado con una situación en la que este habría sido útil, pero tenía que acabar con una desagradable hack (subclases Lista para implementar un operador de conversión).

La pregunta es esta:hay una razón para este comportamiento?Hay una solución más sencilla para conseguir el comportamiento deseado?

Para el registro, creo que la situación que quería que este tipo de comportamiento era genérica de la función de impresión que muestra listas de objetos llamando al método ToString() y el formato de las cadenas de bien.

¿Fue útil?

Solución

OK, todo el mundo que ha utilizado medicamentos genéricos en .red deben de haber encontrado este en un momento u otro.

Sí, intuitivamente se debe trabajar.No, en la actual versión del compilador de C# no.

Eric Lippert tiene una muy buena explicación de este problema (en once piezas o algo y doblar la mente en los lugares, pero bien vale la pena leer).Ver aquí.

editar:

cavó otro enlace, este se analiza cómo java se encarga de esto.Ver aquí

Otros consejos

usted puede utilizar linq to cast:

IEnumerable<Person> oldList = someIenumarable;
IEnumerable<object> newList = oldlist.Cast<object>()

A primera vista, esto no tiene sentido intuitivo.Pero no es así.Mira este código:

List<Person> people = new List<Person>();
List<object> things = people; // this is not allowed
// ...
Mouse gerald = new Mouse();
things.add(gerald);

Ahora de repente tenemos un List de Person los objetos...con un Mouse en su interior!

Esto explica por qué la asignación de un objeto de tipo A<T> a una variable de tipo A<S> no está permitido, incluso si S es un supertipo de T.

El linq solución es buena.Otra solución, puesto que usted está utilizando el tipo de objeto, es pasar la lista como IEnumerable (no la versión genérica).

Editar:C# 4 (actualmente en beta) admite un parámetro de tipo covariante en IEnumerable.Mientras que usted no será capaz de asignar directamente a una Lista<object>, usted puede pasar su lista a un método que espera un IEnumerable<object>.

Mientras que lo que tu tratando de hecho el flujo, lógicamente, es en realidad una característica que muchas lenguas no soportan de forma nativa.Esto es lo que se llama co/contra varianza, la cual tiene que ver con cuándo y cómo los objetos pueden ser implícitamente de una cosa a tro por un compilador.Afortunadamente, C# 4.0 traerá la covarianza y contravarianza a la C# arena, y tales conversiones implícitas como este debe ser posible.

Para una explicación detallada de este, el siguiente Channel9 video debe ser de utilidad:

http://channel9.msdn.com/shows/Going+Deep/Inside-C-40-dynamic-type-optional-parameters-more-COM-friendly/

Con linq métodos de extensión que usted puede hacer

IEnumerable<object> things = people.Cast<object>();
List<object> things = people.Cast<object>().ToList();

De lo contrario, ya que están fuertemente escribir la lista de la conversión implícita no está permitido.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top