c# – 列表,数组和IEnumerable协方差
我将从几个假设开始,以更好地解释我的问题的背景:
数组协方差 假设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> ;? 解决方法
列表协方差是不安全的:
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>. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |