C# IList<;T>;数组和集合为只读错误

C# IList<;T>;数组和集合为只读错误,c#,.net,C#,.net,在修复一个项目中的bug时,您会发现有趣的问题 IList<int> a =new List<int>(); var b = new int[2]; b[0] = 1; b[1] = 2; a = b; a.Clear(); IList a=新列表(); var b=新整数[2]; b[0]=1; b[1]=2; a=b; a、 清除(); 此代码在a.Clear()上引发异常; 我知道如何修复它,但我没有清楚地了解导致此NotSupported异常的所有步骤。为什么

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

IList<int> a =new List<int>();
var b = new int[2];
b[0] = 1;
b[1] = 2;
a = b;
a.Clear();
IList a=新列表();
var b=新整数[2];
b[0]=1;
b[1]=2;
a=b;
a、 清除();
此代码在a.Clear()上引发异常;
我知道如何修复它,但我没有清楚地了解导致此NotSupported异常的所有步骤。为什么编译器没有抛出编译时错误?

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

因此,您可以将标准C#数组分配给
IList
类型,编译器不会抱怨(因为根据语言,数组是-a
IList

唉,这意味着您可以尝试执行一些更改数组的操作,例如
IList.Clear()
IList.Add()
,您将得到一个运行时错误

有关该语言为何如此定义的一些讨论,请参阅以下线程:


因为
a
是一种接口类型。@srinivasredythatiparthy-这与它是一种接口类型无关。@Enigmativity如果
a
List
而不是
IList
它就不会工作。@Magnus-与
IList
无关。这是因为底层类型是
int[]
。如果底层类型是
List
,那么尽管它是
IList
@Enigmativity,但仍然可以正常工作,谢谢您的澄清。