IList <T>数组和Collection是只读ERROR

Ven*_*kyi 9 .net c#

在修复一个项目中的bug时发现有趣的问题

IList<int> a =new List<int>();
var b = new int[2];
b[0] = 1;
b[1] = 2;
a = b;
a.Clear();
Run Code Online (Sandbox Code Playgroud)

此代码在a.Clear()上抛出异常; 我知道如何解决它,但我没有明确得到导致此NotSupported异常的所有步骤.为什么编译器没有抛出编译时错误?

Mat*_*son 12

是的,这是标准C#数组的一个有点恼人的特性:它们实现IList<>,如C#语言所定义.

因此,您可以为一个IList<>类型分配标准C#数组,并且编译器不会抱怨(因为根据语言,数组为IS-A IList<>).

唉,这意味着你可以尝试做一些事情来改变数组,比如IList<>.Clear()或者IList<>.Add()你会得到一个运行时错误.

有关为什么语言定义如下的一些讨论,请参阅以下主题:

为什么数组实现IList?