【发布时间】:2014-09-25 19:11:11
【问题描述】:
这可能是一个非常简单的问题,但对我来说没有意义。
鉴于这个类:
public class Person : ICloneable {
public object Clone()
{
Console.WriteLine("Hello, world");
return new Person();
}
}
为什么会这样?
List<Person> people = new List<Person> { new Person() };
IEnumerable<ICloneable> clonables = people;
但这不是?
List<Person> people = new List<Person> { new Person() };
IList<ICloneable> clonables = people;
为什么我可以分配给 IEnumerable IClonable,但不能分配给 IList ICloneable?
【问题讨论】:
-
您收到的错误消息可能已经告诉您原因。
-
IEnumererable<T>是协变的,这就是它起作用的原因。List<T>不是,也不能是。 -
所以,解决方案是:
cloneables = people.Cast<ICloneable>().ToList(); -
不是一个好的解决方案。你实际上是在创建一个新的
List<ICloneable>,而不是重新分配旧的。