V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
bthulu
V2EX  ›  .NET

List<Apple>不能赋值给 List<object>吗?

  •  
  •   bthulu · 2022-11-23 18:13:12 +08:00 · 2575 次点击
    这是一个创建于 730 天前的主题,其中的信息可能已经有所发展或是发生改变。

    像下面这样的代码居然没法通过编译, 明明 Apple 也是 object 啊.

    List<object> list = new List<Apple>();
    

    但是下面这样又可以

    List<object> list = new List<object>();
    List<Apple> apples = new() {new Apple(), new Apple()};
    foreach (Car apple in apples)
    {
        list.Add(apple);
    }
    
    11 条回复    2022-11-24 01:32:24 +08:00
    fanxiao
        1
    fanxiao  
       2022-11-23 18:18:19 +08:00
    类型安全, 他是 list 是 List<object> 类型,apples 是 List<Apple> 无法将其转换成 List<object> 类型, 但是 Apple 是 object 的子类,自然而然可以转型
    aCodingCat
        2
    aCodingCat  
       2022-11-23 18:19:59 +08:00
    泛型的逆变与协变 ?
    geelaw
        3
    geelaw  
       2022-11-23 18:28:20 +08:00
    你期待 ((List<object>)new List<Apple>()).Add(new Orange()) 发生什么?

    关于 foreach 为什么可以,很可惜,这是 .NET 1.0 的罪孽,因为那个时候没有泛型,如果 in 后面的集合必须采用 IEnumerable 的话,将只能枚举 object 。实际上 foreach 会强行转换得到的对象,见 https://ericlippert.com/2013/07/22/why-does-a-foreach-loop-silently-insert-an-explicit-conversion/
    moen
        4
    moen  
       2022-11-23 18:28:28 +08:00
    你上次不是提问过了吗( https://v2ex.com/t/880881 )?怎么又犯这种错误
    Leviathann
        5
    Leviathann  
       2022-11-23 18:32:07 +08:00
    不是说 C#没有 java 协变逆变的问题么
    dcsuibian
        7
    dcsuibian  
       2022-11-23 18:44:58 +08:00
    子类本身是父类的子类。但子类的集合不是父类集合的子类。我觉得挺合理的。
    bthulu
        8
    bthulu  
    OP
       2022-11-23 19:35:29 +08:00
    @moen 上次用带 out 泛型的 IReadOnlyList 解决了. 但是 IReadOnlySet 没有带 out 的咋办, 这种是不是就没办法了?
    Dorian101
        9
    Dorian101  
       2022-11-24 00:30:21 +08:00
    两个 List 是同级的,两者之间没有派生关系,因此赋值兼容性不适用。
    Dorian101
        10
    Dorian101  
       2022-11-24 00:31:14 +08:00
    C#图解教程第五版 18.10.1 有详细说明
    mind3x
        11
    mind3x  
       2022-11-24 01:32:24 +08:00
    C#居然协变逆变还是针对具体容器类型的……
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2934 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 08:16 · PVG 16:16 · LAX 00:16 · JFK 03:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.