当分配给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;

当分配给IList<;T>;

这是因为这种协方差是一件坏事,而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>中。