在修复一个项目中的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()你会得到一个运行时错误.
有关为什么语言定义如下的一些讨论,请参阅以下主题: