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