当分配给IList<;T>;
本文关键字:gt 分配 lt IList | 更新日期: 2023-09-27 18:22:29
我想知道数组与实现IList的List<T>
有什么不同的行为,其中数组在分配给IList<IPerson>
时似乎绕过了IList的非协变性质(它没有定义为IList<out T>
)。在下面的例子中,除了"people3"之外,所有作业都可以。为什么在personArray为"people4"的情况下任务有效?
public interface IPerson { }
public class Person : IPerson { }
var personList = new List<Person>();
var personArray = new Person[0];
IList<Person> people1 = personList;
IList<Person> people2 = personArray;
IList<IPerson> people3 = personList;
IList<IPerson> people4 = personArray;
这是因为这种协方差是一件坏事,而C#只支持数组,因为Java支持它
这会产生运行时错误
object[] myArray = new string[1];
myArray[0] = 1;
这会产生编译时错误
List<object> myList = new List<string>(1);
myList[0] = 1;
如果是T:U
,则T[]
的实例可以强制转换为IList<U>
,但即使IList<T>.IsReadOnly
为false,IList<U>.IsReadOnly
也将返回true
。注意,即使IList<U>.IsReadOnly
返回true
,如果正在写入的特定项目恰好满足类型T
,则尝试写入IList<U>
仍然可能成功。据我所知,除了尝试并观察是否发生异常外,无法确定由U
标识的特定实例是否可以存储到ILIst<T>
中。