这可能是一个非常简单的问题,但有些东西对我来说没有意义。
给定这个类:
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?
最佳答案
这称为协方差。 Eric Lippert 和 Jon Skeet(以及其他人)在回答这个问题时对协方差(及其双胞胎,逆变)做了一些很好的解释:Difference between Covariance & Contra-variance
基本上,您可以像枚举ICloneable
列表一样枚举Person
列表,不会出现问题因为您无法更改枚举。但是您不能将 Person
列表分配给 ICloneable
列表,因为这样您稍后可以尝试插入 ICloneable< 的一些其他派生词
在其中,这将导致严重违反类型安全。
关于c# - 无法将源类型 'List<Person>' 转换为 IList<ISomething>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26046286/