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);

値は変更されませんが、コンパイラはそれを許可します。なぜ私は2番目に割り当てることができますか?私は私の人生のためにそれを理解することができません、そしてそれは私を怒らせています!(値は変わりませんが)

4

2 に答える 2

3

あなたがこれを書くとき:

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

実際には最初のインデクサーを使用していませんが、2番目のインデクサーを使用しています。これはもっと似ています:

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

最初のインデクサーを使用するための構文は次のとおりです。

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

ただし、インデックス付きプロパティにセッターがないため、これにより、現在受け取っているのと同じコンパイラエラーが発生します。

ちなみに、次のように受け入れるコンストラクターを使用するList<T>.AddRangeか、コンストラクターを使用することで、2番目のインデックス付きプロパティの実装を簡素化できます。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

私はあなたがインデクサーsetのために持っていないと思います:this[int]

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