繁体   English   中英

为什么我不能在阵列上调用RemoveAt?

[英]Why can't I call RemoveAt on an array?

现在,我知道在C#中,数组是固定大小的集合。 有意义的是你不能对它们使用RemoveAt方法, 除了所有数组类型都扩展的System.Array类实现System.Collections.IList接口 ,这需要一个RemoveAt方法。

如果将数组向上转换为IList ,或将其传递 .RemoveAt IList作为参数的方法 ,则可以在其上调用.RemoveAt ,这将在运行时抛出NotSupportedException 但是,如果我 直接调用它, 并直接调用它 ,它将导致编译器错误'int[]' does not contain a definition for 'RemoveAt' ,尽管该方法明显存在。

什么允许编译器在编译时捕获此NotSupportedException 它是特殊的数组,还是我可以定义自己的类来实现这种行为?

Array实际上不应该实现IList,因为它没有完全实现该接口,因此NotSupportedException,但它可能是为了方便而添加的。

调用Array.RemoveAt时它不能编译的原因是因为Array 显式实现了IList的这种方法,这意味着该方法不可用,除非它被转换为该接口。

这看起来像:

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

某些类型的数字索引集合可以调整大小,有些则不可调整大小。 如果.NET为可调整大小和不可调整大小的集合使用了单独的接口,那么编写单个包装类将无法允许客户端调整包装集合的大小,并且可用于不支持调整大小的集合。 如果代码需要包装一些不支持调整大小的集合,但是还需要调整其中的一些集合,则必须为每个目的编写单独的包装类。

如果代码具有数组类型的引用,则编译器将知道该类型执行哪些方法,并且不通过该类型的引用公开。 永远无法有效处理某个方法的类通常不会通过它们自己的类型的引用来公开它,因为代码没有理由在该类型的引用上调用这样的方法。 但是,如果一个类实现了一个接口,它必须考虑到外部代码可能调用无用的方法的可能性,这些方法没有意识到这些方法是无用的,因此必须为接口中的每个方法包含某种代码。

虽然处理接口的实际机制是不同的,但将接口函数视为具有特殊名称可能是有用的,因此如果类Woozle实现了包含方法Foo()的接口IWoozle并使用其自己的函数Foo隐式实现该接口( ),它实际上将包含两个方法: public void Foo(); public void IWoozle▪Foo() { Foo(); } // Not the actual name public void IWoozle▪Foo() { Foo(); } // Not the actual name

如果一个类Zoozle显式地实现了IWoozle.Foo,那么它只会实现后一种方法。 鉴于Woozle x; Zoozle y; Woozle x; Zoozle y; ,给定x.Foo()y.Foo()的编译器会寻找一个名为Foo()的方法( Woozle有,但Zoozle没有)。 给定IWoozle x1=x, y1=y; ,给定x1.Foo()y1.Foo()的编译器会查找IWoozle▪Foo ,它会在xy找到它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM