在一个类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);
编译器将允许它,但值不会改变。 为什么它会让我分配到第二个? 我不能为我的生活搞清楚,这让我发疯了! (即使它没有改变价值)
答案 0 :(得分: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);
但是,这将提供您现在收到的相同编译器错误,因为您在该索引属性上没有setter。
另外,您可以使用List<T>.AddRange
甚至接受List<T>
的{{1}}构造函数来简化第二个索引属性实现,即:
IEnumerable<T>
答案 1 :(得分:0)
我认为set
索引器没有this[int]
:
public List<NewChar> this[Int32 index]
{
get
{
//......
return ret;
}
//set { /*YOU DON'T HAVE THIS METHOD*/}
}