C#:泛型的语义?

C#:泛型的语义?,c#,generics,semantics,C#,Generics,Semantics,我有一份清单: private readonly IList<IList<GameObjectController>> removeTargets; private readonly IList<IList<GameObjectController>> addTargets; 我得到一个编译器错误: 无法从转换 'System.Collections.Generic.IList' 到 'System.Collections.Generic.ILi

我有一份清单:

private readonly IList<IList<GameObjectController>> removeTargets;
private readonly IList<IList<GameObjectController>> addTargets;
我得到一个编译器错误:

无法从转换 'System.Collections.Generic.IList' 到 'System.Collections.Generic.IList'

为什么会发生这种情况?既然
PickUp
GameObjectController
的子类,这不是很好吗?我需要像Java的
映射
这样的东西吗


早些时候,我遇到了一个类似的问题,我试图将
inventory
IList
隐式转换为
ICollection
。这是同一个问题吗?

在这里看到我的另一个答案:

简短版本:

请记住,
IList
IList
是类型系统中两个(且仅两个)完全不同的类。它们唯一的继承关系来自系统。继承树的Collections分支;继承树的GameObjectController分支上根本没有。您不妨尝试将
IList
强制转换为
IList


您可以改为调用
Cast()
扩展方法,该方法可用于
IEnumerable

请参见我的另一个答案:

简短版本:

请记住,
IList
IList
是类型系统中两个(且仅两个)完全不同的类。它们唯一的继承关系来自系统。继承树的Collections分支;继承树的GameObjectController分支上根本没有。您不妨尝试将
IList
强制转换为
IList


您可以改为调用
Cast()
扩展方法,该方法可用于
IEnumerable

这是c#4.0中首先支持的方法。即使如此,它也只适用于IEnumerable,而不适用于IList。

这是c#4.0中首次调用并支持的。即使这样,它也只适用于IEnumerable,而不适用于IList。

您不能将
List
转换为
List
。以下是处理此问题的示例。

您无法将
列表
转换为
列表
。下面是解决这个问题的方法。

基本对象列表当然可以包含派生对象的项。然而,我无法从您的代码中收集到的正是您正在做的事情。您有一个
IList
,然后我们看不到您的方法的实现。但是像下面这样的代码肯定有效(Bar扩展了Foo)

IList foos=new List();
IList Bar=new List(){new Bar(),new Bar()};
foreach(条中的条)
foos.Add(bar);
也许你在尝试下面的场景?这里有一个基本对象列表和一个派生对象列表?如果是这样,你可以像下面这样施展

IList<IList<Foo>> listOfFoos = new List<IList<Foo>>() { foos };
IList<IList<Bar>> listOfBars = new List<IList<Bar>>() { bars };

foreach (IList<Bar> b in listOfBars)
{
    listOfFoos.Add(b.Cast<Foo>().ToList());
}
IList listofoos=new List(){foos};
IList listOfBars=新列表(){bars};
foreach(列表栏中的IList b)
{
添加(b.Cast().ToList());
}

基本对象列表当然可以包含派生对象的项。然而,我无法从您的代码中收集到的正是您正在做的事情。您有一个
IList
,然后我们看不到您的方法的实现。但是像下面这样的代码肯定有效(Bar扩展了Foo)

IList foos=new List();
IList Bar=new List(){new Bar(),new Bar()};
foreach(条中的条)
foos.Add(bar);
也许你在尝试下面的场景?这里有一个基本对象列表和一个派生对象列表?如果是这样,你可以像下面这样施展

IList<IList<Foo>> listOfFoos = new List<IList<Foo>>() { foos };
IList<IList<Bar>> listOfBars = new List<IList<Bar>>() { bars };

foreach (IList<Bar> b in listOfBars)
{
    listOfFoos.Add(b.Cast<Foo>().ToList());
}
IList listofoos=new List(){foos};
IList listOfBars=新列表(){bars};
foreach(列表栏中的IList b)
{
添加(b.Cast().ToList());
}

MoveFromListToWorld的签名?MoveFromListToWorld的签名?协方差是一种可能的解决方案的名称(在这里不起作用),而不是问题的名称。它是问题的核心。不,不是。协方差意味着允许类型以某种方式变化(注意词根)。不变性——或者说一个类型不能改变——是问题的核心。。。你可以将“他不能做什么”(协方差)或“阻止他做什么”(不变性)视为问题的核心。协方差是一种可能的解决方案的名称(在这里不起作用),而不是问题的名称。这是问题的核心。不,不是。协方差意味着允许类型以某种方式变化(注意词根)。不变性——或者说一个类型不能改变——是问题的核心。。。你可以将“他不能做什么”(协方差)或“阻止他做什么”(不变性)视为问题的核心。这是正确的。我正在努力做到以上几点。我想怎么做?没错。我正在努力做到以上几点。我想怎么做?好吧,如果你写代码来转换它,你可以转换它——你不能转换它。好吧,如果你写代码来转换它,你可以转换它——你不能转换它。
IList<IList<Foo>> listOfFoos = new List<IList<Foo>>() { foos };
IList<IList<Bar>> listOfBars = new List<IList<Bar>>() { bars };

foreach (IList<Bar> b in listOfBars)
{
    listOfFoos.Add(b.Cast<Foo>().ToList());
}