2012-08-31 12 views
5

¿Es posible hacer la siguiente compilación sin:Reparto de tipo genérico para interactuar tipo de restricción

  1. Haciendo IFooCollection genérica
  2. explícitamente la implementación de IFooCollection.Items en FooCollection y realizar una conversión explícita.

public interface IFoo 
{ 

} 

public interface IFooCollection 
{ 
    IEnumerable<IFoo> Items { get; } 
} 

public class FooCollection<T> : IFooCollection where T : IFoo 
{ 
    public IEnumerable<T> Items { get; set; } 
} 

estoy bastante feliz con la segunda solución (que implementa la interfaz explícitamente) pero me gustaría entender por qué necesito para emitir T como IFoo cuando tenemos una limitación genérica que especifica que T obligada implementar IFoo.

Respuesta

9

La razón es la siguiente:

IFooCollection.Items puede contener cualquier clase que implementa IFoo. Por lo tanto, puede contener FooA, FooB, FooC al mismo tiempo.

FooCollection<FooA>.Items por el contrario, solo pueden contener elementos del tipo FooA. Si intentas enviar FooB o FooC a FooA obtendrás un InvalidCastException aunque todos implementan IFoo.

Cuestiones relacionadas