奇数接口语法

时间:2012-11-02 17:16:32

标签: c# syntax

全部,我遇到了以下属性和对象声明。第一个返回一个接口,第二个我不太确定

public IConfig this[int index]
{
    get { return (IConfig)configList[index]; }
}

object IList.this[int index]
{
    get { return configList[index]; }
    set {  }
}

我从未见过这种类型的声明,即带有方括号的public IConfig this[int index]以及thisobject IList.this[int index]的奇怪使用。有人可以解释这两个符号吗?

我试图查看我的书籍,并使用谷歌,但我不确定我在寻找什么。谢谢你的时间。

编辑。它们属于一个继承如下的类

public class ConfigCollection : ICollection, IEnumerable, IList
{
    ....
}

3 个答案:

答案 0 :(得分:12)

它被称为indexer,允许您在从对象获取元素时执行instance[1];。您可以在implementing IList上查看此答案作为参考

答案 1 :(得分:3)

我还想在Johan的帖子中再添加一个细节 - 由于多个接口,你实际上有2个索引器在该类中继续。

IList实现的索引器是显式声明的,因此默认情况下不会调用此索引器。如果要使用IList版本的索引器,则需要执行此操作:

ConfigCollection thisCollection = GetCollectionItems();

// this invokes the IList.this indexer....
var firstItem = ((IList)thisCollection)[0];  

// this invokes the other indexer
var firstItemAsIConfig = thisCollection[0];

根据您与我们分享的代码,我认为IList.this索引器是多余的。

答案 2 :(得分:1)

说你有

public class MyAggregate
{
  private List<String> _things;
  public MyAggregate()
  {
    _things = new List<String>();
  }
}

所以你可以添加

public String GetItem(int argIndex)
{
  return _things[argIndex];
}

public void SetItem(int argIndex, String argValue)
{
  _things[argIndex] = argValue;
}

然后通过myAggregate.GetItem(0)访问以获取它并myAggregate.SetItem(0,"Thing")进行设置。

或者你可以添加

public string this[int argIndex] 
{
  get {return _things[argIndex];}
  set { _things[argIndex] = value;}
}

并通过myAggregate[0]访问它以获取它并myAggregate[0] = "Thing"进行设置。

后者往往感觉更自然,每次都不需要提出两个方法名称。