像下面这样的代码居然没法通过编译, 明明 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);
}
像下面这样的代码居然没法通过编译, 明明 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);
}
|
fanxiaoNov 23, 2022
1
类型安全, 他是 list 是 List<object> 类型,apples 是 List<Apple> 无法将其转换成 List<object> 类型, 但是 Apple 是 object 的子类,自然而然可以转型
|
|
aCodingCatNov 23, 2022
2
泛型的逆变与协变 ?
|
|
geelawNov 23, 2022
3
你期待 ((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/ |
|
moenNov 23, 2022
4
你上次不是提问过了吗( https://v2ex.com/t/880881 )?怎么又犯这种错误
|
|
LeviathannNov 23, 2022
5
不是说 C#没有 java 协变逆变的问题么
|
|
wdwwtzyNov 23, 2022
6
|
|
dcsuibianNov 23, 2022
7
子类本身是父类的子类。但子类的集合不是父类集合的子类。我觉得挺合理的。
|
|
8
@moen 上次用带 out 泛型的 IReadOnlyList 解决了. 但是 IReadOnlySet 没有带 out 的咋办, 这种是不是就没办法了?
|
|
Dorian101Nov 24, 2022
9
两个 List 是同级的,两者之间没有派生关系,因此赋值兼容性不适用。
|
|
Dorian101Nov 24, 2022
10
C#图解教程第五版 18.10.1 有详细说明
|
|
mind3xNov 24, 2022
11
C#居然协变逆变还是针对具体容器类型的……
|