无需以下命令即可进行以下编译:

  • 使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的任何类。因此,它可以同时包含FooAFooBFooC

    另一方面,FooCollection<FooA>.Items只能包含FooA类型的元素。尝试将FooBFooC转换为FooA会产生一个InvalidCastException,尽管它们都实现了IFoo

    09-15 23:40