现在,我知道在C#中,数组是固定大小的集合。这是有道理的,您不能对它们使用RemoveAt方法except that the System.Array class, which all array types extend from, implements the System.Collections.IList interface,而这需要RemoveAt方法。

如果是you upcast an array to an IList , or pass it to a method taking an IList as an argument,则可以在其上调用.RemoveAt,这将在运行时抛出NotSupportedException。但是,如果我不修改它,and call it directly,尽管方法明确存在,它将导致编译器错误'int[]' does not contain a definition for 'RemoveAt'

是什么让编译器在编译时捕获此NotSupportedException?它是数组的特例,还是我可以定义自己的类以具有这种行为?

最佳答案

数组实际上不应该实现IList,因为它没有完全实现该接口(interface),因此不是NotSupportedException,但为方便起见添加了它。

调用Array.RemoveAt时无法编译的原因是因为Array实现了IList explicitly的方法,这意味着该方法除非将其强制转换为该接口(interface),否则不可用。

看起来像:

class OnlySortOfAList : IList
{
  void IList.RemoveAt(int Index) // note the lack of access modifier
  {
    throw new NotSupportedException();
  }
}

10-06 12:03