1

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

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]带方括号和奇怪使用thisand object IList.this[int index]。有人可以解释这两种符号吗?

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

编辑。这些在一个继承如下的类中

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

3 回答 3

12

它被称为 anindexer并且允许您在instance[1];从对象中获取元素时执行此操作。你可以看看这个答案implementing IList作为参考

于 2012-11-02T17:18:22.023 回答
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根据您与我们共享的代码,我认为索引器是多余的。

于 2012-11-02T17:25:20.990 回答
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"设置它。

后者往往感觉更自然,您不必每次都想出两个方法名称。

于 2012-11-02T17:41:07.153 回答