【发布时间】:2015-09-17 17:21:39
【问题描述】:
我有 2 个课程 A 和 B。 B 继承自 A。如果我有类似的方法
void works(A aType) 我可以通过 B 类型的对象就好了。但是,void fails(List<A> aListType) 之类的方法对于 List<B> 类型失败,Visual Studio 抱怨它无法在 List<A> 和 List<B> 之间转换。我可以用泛型解决这个问题,但为什么它首先会失败?另外,我应该只使用泛型吗?
这是一个基本的例子:
using System.Collections.Generic;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
B bType1 = new B();
works(bType1); // This works
List<B> bListType1 = new List<B>();
works(bListType1); // This works
List<B> bListType2 = new List<B>();
fails(bListType2); // This fails
}
static void works(A aType)
{
return;
}
static void works<T>(List<T> aListType) where T : A
{
return;
}
static void fails(List<A> aListType)
{
return;
}
}
class A
{
}
class B : A
{
}
}
【问题讨论】:
-
阅读此处:stackoverflow.com/a/10957035/1341409。这是关于协变和逆变的。
-
List<B>不继承自List<A>,即使B继承自A。