Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将泛型类型转换为接口类型约束_C#_.net - Fatal编程技术网

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

C# 将泛型类型转换为接口类型约束,c#,.net,C#,.net,可以进行以下编译,而无需: 制作IFooCollectiongeneric 在FooCollection上显式实现IFooCollection.Items,并执行显式强制转换 公共接口IFoo { } 公共接口IFooCollection { IEnumerable项{get;} } 公共类FooCollection:IFooCollection,其中T:IFoo { 公共IEnumerable项{get;set;} } 我对第二个解决方案(显式实现接口)很满意,但我想了解为什么我需要将T转

可以进行以下编译,而无需:

  • 制作
    IFooCollection
    generic
  • FooCollection
    上显式实现
    IFooCollection.Items
    ,并执行显式强制转换

  • 公共接口IFoo
    {
    }
    公共接口IFooCollection
    {
    IEnumerable项{get;}
    }
    公共类FooCollection:IFooCollection,其中T:IFoo
    {
    公共IEnumerable项{get;set;}
    }
    

    我对第二个解决方案(显式实现接口)很满意,但我想了解为什么我需要将
    T
    转换为
    IFoo
    ,因为我们有一个通用约束,指定
    T
    必须实现
    IFoo

    ,原因如下:

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

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

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