Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.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# - Fatal编程技术网

C# 强制转换泛型集合项类型

C# 强制转换泛型集合项类型,c#,C#,下面的代码说明了我遇到的一种情况。真正的代码使用不同的名称并以其他方式获取值,但它们与我需要的答案相匹配。特别是在第76-89行(我控制的唯一行)中,我需要提取一个带有值的“ICollection”类型的变量,我不喜欢任何使用的方法。有没有另一种不创建类“AbstractCollection”的方法 名称空间控制台EAPP1 { 使用System.Collections.Generic; 使用System.Linq; 界面粗糙度 { 字符串Id{get;} 字符串名称{get;} } 类实体:属

下面的代码说明了我遇到的一种情况。真正的代码使用不同的名称并以其他方式获取值,但它们与我需要的答案相匹配。特别是在第76-89行(我控制的唯一行)中,我需要提取一个带有值的“ICollection”类型的变量,我不喜欢任何使用的方法。有没有另一种不创建类“AbstractCollection”的方法

名称空间控制台EAPP1
{
使用System.Collections.Generic;
使用System.Linq;
界面粗糙度
{
字符串Id{get;}
字符串名称{get;}
}
类实体:属性
{
公共实体(字符串id、字符串名称)
{
Id=Id;
名称=名称;
}
公共字符串Id{get;}
公共字符串名称{get;}
}
接口ICollection
{
IEnumerable项{get;}
}
类集合:ICollection,其中TGeneric:Entity,Entity
{
公共IEnumerable项{get;set;}
}
类AbstractCollection:ICollection,其中TAbstract:class,Entity
{
公共抽象集合(ICollection集合)
{
此._Items=新列表();
if(集合?.Items!=null)
{
foreach(集合中的混凝土混凝土项.Items)
{
TAbstract abstractItem=作为TAbstract的具体项目;
本._Items.Add(abstractItem);
}
}
}
公共数字项目
{
获取{返回此。_Items;}
设置{this._Items=value?.ToList();}
}
私有IList_项{get;set;}
}
类EntityCollection:集合
{
公共实体集合()
{
var items=新列表()
{
新实体(“1”、“名称1”),
新实体(“2”,“名称2”),
新实体(“3”、“名称3”)
};
项目=项目;
}
}
类上下文
{
公共上下文()
{
var concreteItems=新EntityCollection();
//我可以从这一行修改到方法的末尾,但之前没有任何代码。
//我希望“list1”中的值为空。
var list1=作为ICollection的具体项目;
var list2=作为ICollection的具体项目;
var abstractItems=新列表();
foreach(实体concreteItems.Items中的concreteItem)
{
Entity abstractItem=作为Entity的具体项;
abstractItems.Add(abstractItem);
}
//为什么“list3”为空?
var list3=抽象项作为ICollection;
//我想避免类“AbstractCollection”
var list4=新的抽象集合(list2);
//最后,“list5”具有我想要的价值。
var list5=list4作为ICollection;
}
}
班级计划
{
静态void Main(字符串[]参数)
{
var context=新上下文();
}
}
}

解决方案的协方差指南:

interface ICollection<out TGeneric>
{
    IEnumerable<TGeneric> Items { get; }
}
接口ICollection
{
IEnumerable项{get;}
}

“在第76-89行中”
——我们不知道这些行是什么——你不能做你正在尝试的事情。你需要学习的主题是协方差和逆变。这个问题几乎每天都有人问。再说一次:一碗苹果不是一碗水果。为什么?因为你可以把香蕉放进一碗水果里,但不能把香蕉放进一碗苹果里。一碗水果不是一碗苹果,因为它可能已经含有香蕉。因此,碗里的水果和碗里的苹果是不兼容的。@EricLippert这里更像是一碗网球不是一碗苹果。集合
列表
i集合
无关。您创建的类型
i集合
collection
与系统类型
system.Collections.Generic
不同,这可能会导致混淆。您可能需要重命名为,例如,
IEnumerableContainer
。然后,也许看看和。如果我将
ICollection
的定义更改为
ICollection
,则
list1
变为非空,请参阅
interface ICollection<out TGeneric>
{
    IEnumerable<TGeneric> Items { get; }
}