将泛型类型转换为接口类型约束

时间:2012-08-31 11:14:07

标签: c# .net

可以在没有:

的情况下进行以下编译
  1. 制作IFooCollection通用
  2. IFooCollection.Items上明确实施FooCollection并执行明确演员。

  3. 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

1 个答案:

答案 0 :(得分:9)

原因如下:

IFooCollection.Items可以包含任何实现IFoo的类。因此它可以同时包含FooAFooBFooC

另一方面,

FooCollection<FooA>.Items只能包含FooA类型的元素。尝试将FooBFooC投射到FooA会产生InvalidCastException,但所有实施IFoo