【发布时间】:2020-08-26 19:42:10
【问题描述】:
我有一个泛型类型的类:
class SomeClass<T>
{
}
还有两个类 -> 一个继承自另一个:
class Animal
{
}
class Lion : Animal
{
}
现在我想用基本泛型创建一个“SomeClass”变量,并给它一个继承类型作为泛型类型的对象,如下所示:
void Test()
{
SomeClass<Lion> someLion = new SomeClass<Lion>();
SomeClass<Animal> someAnimal = someLion; //Error line
}
错误是:
无法将类型“VitrasUI.SomeClass”隐式转换为“VitrasUI.SomeClass”
据我了解,我应该能够以这种方式转换它,因为它也适用于 IEnumerables:
void Test1()
{
IEnumerable<Lion> listLion = new List<Lion>();
IEnumerable<Animal> listAnimal = listLion;
}
【问题讨论】:
-
在 C# 中搜索协变和逆变
-
协方差不适用于泛型类,仅适用于接口。
IEnumerable声明为IEnumerable<out T>,您可以使SomeClass接口并使其与T协变 -
(并且仅在声明为
ISomeInterface<out T>时) -
一个
IEnumerable<T>仅用于获取T的out 个实例。使用List<T>(或IList<T>),您承诺您还可以将T的实例放入。现在想象一个List<Zebra>被转换为List<Animal>,然后将Lion的实例放在那里。这会引起一些麻烦。 -
我查了一遍,弄明白了。感谢您的快速回复。
标签: c# generics inheritance casting