c# – 列表,数组和IEnumerable协方差

c# – 列表,数组和IEnumerable协方差,第1张

概述我将从几个假设开始,以更好地解释我的问题的背景: 数组协方差 假设1.1 值类型的数组不是协变的. int []无法传递object []. 假设1.2 引用类型的数组与有效的IEnumerable协变. string []可以传递给IEnumerable< object>). 假设1.3 引用类型的数组与有效的协变数组协变. string []可以传递给object []. 列出协方差 假设2. 我将从几个假设开始,以更好地解释我的问题的背景:

数组协方差

假设1.1

值类型的数组不是协变的. int []无法传递object [].

假设1.2

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

假设1.3

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

列出协方差

假设2.1(与1.1相同)

值类型的列表不是协变的.列表与LT; INT>无法传递List< object>.

假设2.2(与1.2相同)

引用类型的列表与有效的IEnumerable协变.列表与LT;串GT;可以传递IEnumerable< object>).

假设2.3(与1.3不同)

引用类型列表与有效协变列表不协变.列表与LT;串GT;无法传递List< object>).

我的问题涉及假设1.3,2.2和2.3.特别:

>为什么string []可以传递给object [],但是List< string>不适用于List< object&gt ;?
>为什么List< string>传递IEnumerable< object>但不适用于List< object&gt ;?

解决方法 列表协方差是不安全的:
List<string> strings = new List<string> { "a","b","c" };List<object> objects = strings;objects.Add(1);              //

由于同样的原因,数组协方差也是不安全的:

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

C#中的数组协方差被识别为as a mistake,并且自版本1起已存在.

由于无法通过IEnumerable< T>来修改集合.接口,可以安全地输入List< string>作为IEnumerable< object>.

总结

以上是内存溢出为你收集整理的c# – 列表,数组和IEnumerable协方差全部内容,希望文章能够帮你解决c# – 列表,数组和IEnumerable协方差所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1258181.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存