he especificado un par de interfaces, que me estoy poniendo en práctica como entidades utilizando Entity Framework 4. El código de demostración simple que puede llegar a es:Contravariance y Entity Framework 4.0: cómo especificar EntityCollection como IEnumerable?
public class ConcreteContainer : IContainer
{
public EntityCollection<ConcreteChild> Children { get; set; }
}
public class ConcreteChild : IChild
{
}
public interface IContainer
{
IEnumerable<IChild> Children { get; set; }
}
public interface IChild
{
}
recibo el siguiente error del compilador de lo anterior:
'Demo.ConcreteContainer' no no implementa miembro de interfaz 'Demo.IContainer.Children'. '' Demo.ConcreteContainer.Children no se puede poner en práctica '' Demo.IContainer.Children porque no tiene la relación del tipo de retorno de
Mi comprensión actual 'System.Collections.Generic.IEnumerable' es que esto se debe a IEnumerable (que se implementa por EntityCollection) es covariante pero se supone que no contravariant:
este tipo de parámetro es covariante. Es decir, puede usar ya sea del tipo que especificó o de cualquier tipo que sea más derivado. Para obtener más información acerca de la covarianza y la contravarianza, vea Covarianza y contravarianza en genéricos.
Estoy en lo correcto, & si es así, ¿hay alguna manera de que pueda lograr mi objetivo de especificar la interfaz IContainer
puramente en términos de otras interfaces en lugar de utilizar clases concretas?
O, ¿estoy malentendiendo algo más fundamental?
Gracias por confirmar mis sospechas. El enfoque de la interfaz genérica es agradable, pero no funciona con EF4, lo que hace que EF4 sea bastante desafiante para simular en su totalidad cuando se prueban las unidades. Como resultado, nos hemos movido principalmente a pruebas de integración para entidades EF. –