1

在 CharList 类中,我有一个私有列表 (List<List<NewChar>>) 和几个索引器:

private List<List<NewChar>> _charList;

// ...

public NewChar this[Int32 inner, Int32 outer]
{
    get
    {
       if (inner < 0 || inner >= _charList.Count ||
            outer < 0 || outer >= _charList[inner].Count)
            throw new ArgumentException("NewCharList indexer[,]: Invalid index!");

       return _charList[inner][outer];
    }
}

public List<NewChar> this[Int32 index]
{
    get
    {
        if (index < 0 || index > MaxCharListIndex)
            throw new ArgumentException("NewCharList indexer[]: Invalid index");
         List<NewChar> ret = new List<NewChar>(_charList[index].Count);

        for (int i = 0; i < _charList[index].Count; i++)
            ret.Add(_charList[index][i]);

        return ret;
    }
}

在测试代​​码(另一个类)中,如果我调用

charList[0] = null;

我收到编译器错误“无法将属性或索引器 xxx 分配给 - 它是只读的”,但如果我调用

charList[0][0] = new NewChar(22,22);

编译器将允许它,尽管值不会改变。为什么它会让我分配到第二个?我一辈子都想不通,这让我发疯!(即使它不会改变值)

4

2 回答 2

3

当你写这个:

charList[0][0] = new NewChar(22,22);

您实际上并没有使用您的第一个索引器,而是您的第二个。这更像是:

List<NewChar> temp = charList[0];
temp[0] = new NewChar(22,22);

使用您的第一个索引器的语法是:

charList[0, 0] = new NewChar(22,22);

但是,这将提供您现在收到的相同编译器错误,因为您在该索引属性上没有设置器。

List<T>.AddRange附带说明一下,您可以通过使用甚至List<T>接受 的构造函数来简化您的第二个索引属性实现IEnumerable<T>,即:

get
{
    if (index < 0 || index > MaxCharListIndex)
        throw new ArgumentException("NewCharList indexer[]: Invalid index");
    return new List<NewChar>(_charList[index]);
}
于 2012-05-01T19:06:40.837 回答
0

我认为您没有索引setthis[int]

public List<NewChar> this[Int32 index]
{
    get
    {
        //......
        return ret;
    }
   //set { /*YOU DON'T HAVE THIS METHOD*/}
}
于 2012-05-01T19:09:31.533 回答