无需以下命令即可进行以下编译:
IFooCollection
通用IFooCollection.Items
上显式实现FooCollection
并执行显式强制转换。 public interface IFoo
{
}
public interface IFooCollection
{
IEnumerable<IFoo> Items { get; }
}
public class FooCollection<T> : IFooCollection where T : IFoo
{
public IEnumerable<T> Items { get; set; }
}
我对第二种解决方案(显式实现接口(interface))很满意,但想了解为什么当我们有一个通用约束指定
T
必须实现IFoo
时,为什么需要将T
转换为IFoo
。 最佳答案
原因如下:IFooCollection.Items
可以包含实现IFoo
的任何类。因此,它可以同时包含FooA
,FooB
和FooC
。
另一方面,FooCollection<FooA>.Items
只能包含FooA
类型的元素。尝试将FooB
或FooC
转换为FooA
会产生一个InvalidCastException
,尽管它们都实现了IFoo
。