如何实现List<Employee> e = new List<Associate>()
?这是错的吗?
class Employee
{
public int ID { get; set; }
public string Name { get; set; }
}
class Associate : Employee
{
}
class Compute
{
static void Main()
{
List<Employee> e = new List<Associate>();
}
}
答案 0 :(得分:4)
想象一下,你有另一个继承自Employee
的类,比方说,
class Manager : Employee
{
}
然后,在你的例子中,这可能会发生,
class Compute
{
static void Main()
{
List<Employee> employees = new List<Associate>();
employees.Add(new Manager()); // Hmmm... what?
}
}
突然您在Manager
列表中有Associate
,这违反了类型规则,因为Manager
和Associate
没有类关系。这就是List<T>
将T
类型参数声明为不变(而不是List<out T>
或协变的原因之一,这样的事情实际上可能会发生)
答案 1 :(得分:3)
您可以将派生类添加到基类列表中。
List<Employee> e= new List<Employee>();
e.Add(new Associate());
答案 2 :(得分:1)
你做不到。这种行为的原因是您仍然可以将基类实例添加到列表应该只是派生类(如BrunoLM提供的blogs.msdn中所述)。
e.Add(new Employee());
以下是避免此问题的可能方法:
var
来隐式定义变量的类型(它确实属于List<Associate>
IEnumerable<Employee>
(并且您将能够传递List<Employee>
或List<Associate>
)