2012-05-01 5 views
1

는 CharList, 나는 개인 목록을 가지고 (목록 < 목록 < 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); 
를 호출하는 경우

값이 변경되지 않지만 컴파일러에서 허용합니다. 두 번째 이유는 무엇입니까? 나는 내 인생을 위해 그것을 이해할 수 없다. 그리고 그것은 나를 미치게하고있다! 당신이 쓸 때

답변

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 또는 IEnumerable<T>을 받아도 List<T> 생성자를 사용하여 두 번째 색인 속성 구현을 간소화 할 수 있습니다 예 :

get 
{ 
    if (index < 0 || index > MaxCharListIndex) 
     throw new ArgumentException("NewCharList indexer[]: Invalid index"); 
    return new List<NewChar>(_charList[index]); 
} 
0

난 당신이 this[int] 인덱서에 대한 set이없는 생각 :

public List<NewChar> this[Int32 index] 
{ 
    get 
    { 
     //...... 
     return ret; 
    } 
    //set { /*YOU DON'T HAVE THIS METHOD*/} 
} 
+0

죄송합니다 - 이것은 내가 원하는 행동입니다. (색인 작성자는이 목록을 변경하지 않습니다.) - 그것은 두 번째 것이고 그 이유는 궁금합니다. – Richard

관련 문제