c# - 无法将源类型 'List<Person>' 转换为 IList<ISomething>

标签 c# .net casting

这可能是一个非常简单的问题,但有些东西对我来说没有意义。

给定这个类:

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/

相关文章:

c# - 从 IronPython 调用带有可变参数的 CLR 方法

c# - 有什么办法可以在 x :DataType? 中使用值类型

c# - 连接字符串格式和 SQL Server 登录错误

c# - 一台服务器许多客户端 : Threads or classes

.net - 我应该如何在 VB.NET 中进行转换?

c++ - 使用运行时类型识别从 void 指针获取数据

c# - Office 365 API - 创建新用户,获取许可信息;使用哪个API?

具有 ASP.NET API 凭据的 JavaScript XMLHttpRequest

c# - 我可以使用 C# 列出本地安装的数字证书吗?

java - 类转换异常