[C#]CS1612: 'List.this[int]'은(는) 변수가 아니므로 해당 반환 값을 수정할 수 없습니다.

리스트를 통해 구조체의 맴버에 접근할때 다음과 같은 오류가 난다.
리스트의 코드는 대략 간략하게 다음과 같이 구성되어있다고 보면 알기 쉽다.

  1. class List<T>
  2. {
  3.         T[] m_listData;
  4.         int m_nIdx;
  5.  
  6.         public List(int size)
  7.         {
  8.                 m_listData = new T[size];
  9.         }
  10.  
  11.         public void Add(T data)
  12.         {
  13.                 m_listData[m_nIdx] = data;
  14.         }
  15.         //인덱서를 이용 배열의 값을 리턴함. 구조체는 값이 복사된다.
  16.         public T this[int idx]
  17.         {
  18.                 get { return m_listData[idx]; }
  19.                 set { m_listData[idx] = value; }
  20.         }
  21. }



  • 오류코드

    1. struct StructA    {
    2.         public int m_nData;
    3.  
    4.         public void SetData(int a)
    5.         {
    6.             m_nData = a;
    7.         }
    8. }
    9.  
    10. static void Main()
    11. {
    12.        List<StructA> listStruct = new List<StructA>();
    13.        listStruct.Add(new StructA());
    14.        listStruct[0].m_nData = 10; //컴파일에러. CS1612
    15.        listStruct[0].SetData(10); //값이 변경되지않음.
    16.  
    17.        //위의 코드는 다음과 같은 코드라고 보면 이해하기 쉽다.
    18.        StructA sA = listStruct[0];
    19.        sA.m_nData = 10;
    20.        sA.SetData(10);
    21. }
    문제:
    구조체를 이용하는 리스트는 멤버의 값을 인덱스로 접근하면 값을 변경하지못함.

    결론:
    인덱서는 겟터를 이용하여 배열의 값이 리턴되기때문에, 
    참조를 기본으로 하는 클래스는 문제없지만, 
    복사가 되는 구조체는 이러한 문제가 생길수 밖에 없는것이다.

    댓글

    이 블로그의 인기 게시물

    [gpt/gpt와 대화/번역]이미지생성형ai와 인공지능에 대하여

    [AI요약/퍼플렉시티]게임산업의 침체와 한국게임업계의 희망