C# c语言中的接口和列表#
我对以下接口和类有问题:C# c语言中的接口和列表#,c#,generics,C#,Generics,我对以下接口和类有问题: public interface IRelated { } public class BaseItem:IRelated { public string Name{get;set;} public List<IRelated> RelatedItems{get;set;} } 公共接口i相关 { } 公共类基项:IRelated { 公共字符串名称{get;set;} 公共列表相关项{get;set;} } 现在,当我尝试在其
public interface IRelated
{
}
public class BaseItem:IRelated
{
public string Name{get;set;}
public List<IRelated> RelatedItems{get;set;}
}
公共接口i相关
{
}
公共类基项:IRelated
{
公共字符串名称{get;set;}
公共列表相关项{get;set;}
}
现在,当我尝试在其他类中执行以下操作时,会出现编译错误:
List<IRelated> listofrelateditems=new List<BaseItem>();
List listofrelateditems=new List();
无法隐式转换类型
列表
至列表
该接口的原因是,将来可能会有另一个类与此BaseItem相关。您不能这样做-即使是.NET 4中的通用协方差也不会帮助您,因为
List
是一个类,甚至IList
都是不变的,因为它既有t
进入,也有退出
正是因为您将来可能会有一个新的IRelated
实现,所以您不能这样做。考虑:
List<IRelated> listOfRelatedItems = new List<BaseItem>();
listOfRelatedItems.Add(new OtherRelatedItem());
List listOfRelatedItems=new List();
添加(新的OtherRelatedItem());
其中OtherRelatedItem
实现了IRelated
,但不是从BaseItem
派生的。现在您已经有了一个列表
,其中包含了除基本项以外的内容
!换句话说,它破坏了类型安全性
基本上,您必须创建一个列表
,而不是列表
有关通用差异以及为什么它有时适用有时不适用的更多信息,请转到并搜索“差异”,以查找我去年就这个主题所做的演示视频。正如您自己所说:您可能有另一个类可以
IRelated
。如何将此类类的实例添加到列表中
你必须写:
List<IRelated> listofrelateditems = new List<IRelated>();
List listofrelateditems=new List();
更改为:
List<IRelated> listofrelateditems=new List<IRelated>();
List listofrelateditems=new List();