在修复一个项目中的bug时发现有趣的问题
IList<int> a =new List<int>();
var b = new int[2];
b[0] = 1;
b[1] = 2;
a = b;
a.Clear();
此代码在a.Clear()上抛出异常; 我知道如何解决它,但我没有明确得到导致此NotSupported异常的所有步骤。为什么编译器没有抛出编译时错误?
答案 0 :(得分:11)
是的,这是标准C#数组的一个有点烦人的特性:它们实现了IList<>
,由C#语言定义。
因此,您可以将标准C#数组分配给IList<>
类型,编译器不会抱怨(因为根据语言,数组为IS-A IList<>
)。
唉,这意味着您可以尝试做一些事情来更改数组,例如IList<>.Clear()
或IList<>.Add()
,您将收到运行时错误。
有关为什么语言定义如下的一些讨论,请参阅以下主题: