- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我将从几个假设开始,以更好地解释我的问题的背景:
值类型的数组不是协变的。 int[]
不能通过 object[]
.
引用类型的数组与有效的 IEnumerable
是协变的. string[]
可以传递为IEnumerable<object>
).
引用类型的数组与有效的协变数组是协变的。 string[]
可以传递为object[]
.
值类型的列表不是协变的。 List<int>
不能通过 List<object>
.
引用类型的列表与有效的 IEnumerable
是协变的. List<string>
可以传递为IEnumerable<object>
).
引用类型列表与有效协变不协变 List
. List<string>
不能通过 List<object>
).
我的问题涉及假设 1.3、2.2 和 2.3。具体来说:
string[]
传为object[]
,但是List<string>
不适用于 List<object>
?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/
在我的设置中,我试图有一个界面 Table继承自 Map (因为它主要用作 map 的包装器)。两个类继承自 Table - 本地和全局。全局的将有一个可变的映射,而本地的将有一个只有本地条目的映射。
Rust Nomicon 有 an entire section on variance除了关于 Box 的这一小节,我或多或少地理解了这一点和 Vec在 T 上(共同)变体. Box and Vec
我是一名优秀的程序员,十分优秀!