9

在修复一个项目中的错误期间发现有趣的问题

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

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

4

1 回答 1

12

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

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

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

有关为什么这样定义语言的一些讨论,请参阅以下线程:

为什么数组实现IList?

于 2013-11-06T10:06:07.367 回答