2012-08-31 61 views
5

是可以进行以下不编译:投泛型类型的接口类型约束

  1. 制作IFooCollection通用
  2. FooCollection明确实施IFooCollection.Items并进行显式类型转换。

public interface IFoo 
{ 

} 

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

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

我与第二个解决方案开心就好(显式地实现接口),但想明白,为什么我需要投T作为IFoo当我们有一个通用的限制指定T绝实施IFoo

回答

9

原因如下:

IFooCollection.Items可以包含实现IFoo任何类。因此它可以同时包含FooAFooB,​​。

FooCollection<FooA>.Items另一方面只能包含FooA类型的元素。试图将FooB或​​投射到FooA将产生InvalidCastException,尽管所有实施IFoo