Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.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语言中的接口和列表#_C#_Generics - Fatal编程技术网

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();