可以在没有:
的情况下进行以下编译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; }
}
我对第二个解决方案(明确地实现接口)感到非常满意,但是当我们有一个指定{{1的通用约束'时,我想理解为什么我需要将T
转换为IFoo
必须实现T
。
答案 0 :(得分:9)
原因如下:
IFooCollection.Items
可以包含任何实现IFoo
的类。因此它可以同时包含FooA
,FooB
,FooC
。
FooCollection<FooA>.Items
只能包含FooA
类型的元素。尝试将FooB
或FooC
投射到FooA
会产生InvalidCastException
,但所有实施IFoo
。