gpt4 book ai didi

c# - 列表、数组和 IEnumerable 协方差

转载 作者:太空狗 更新时间:2023-10-29 21:05:00 25 4
gpt4 key购买 nike

我将从几个假设开始,以更好地解释我的问题的背景:

数组协方差

假设1.1

值类型的数组不是协变的。 int[]不能通过 object[] .

假设 1.2

引用类型的数组与有效的 IEnumerable 是协变的. string[]可以传递为IEnumerable<object> ).

假设1.3

引用类型的数组与有效的协变数组是协变的。 string[]可以传递为object[] .

列表协方差

假设2.1(同1.1)

值类型的列表不是协变的。 List<int>不能通过 List<object> .

假设2.2(同1.2)

引用类型的列表与有效的 IEnumerable 是协变的. List<string>可以传递为IEnumerable<object> ).

假设2.3(不同于1.3)

引用类型列表与有效协变不协变 List . List<string>不能通过 List<object> ).


我的问题涉及假设 1.3、2.2 和 2.3。具体来说:

  1. 为什么可以string[]传为object[] ,但是List<string>不适用于 List<object>
  2. 为什么可以List<string>传为IEnumerable<object>但不适用于 List<object>

最佳答案

列表协方差是不安全的:

List<string> strings = new List<string> { "a", "b", "c" };
List<object> objects = strings;
objects.Add(1); //

出于同样的原因,数组协变也是不安全的:

string[] strings = new[] { "a", "b", "c" };
object[] objects = strings;
objects[0] = 1; //throws ArrayTypeMismatchException

C# 中的数组协变被识别 as a mistake ,并且从版本 1 开始就存在。

由于无法通过 IEnumerable<T> 修改集合接口(interface),输入 List<string> 是安全的作为IEnumerable<object> .

关于c# - 列表、数组和 IEnumerable 协方差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17061936/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com