List에 구조체를 담아두고 아래와 같이 반복문에서 사용하는 경우가 많이 있을겁니다. 

public struct SomeData
{
    public int Age;
    public string Name;
}

private List<SomeData> mSomedata = new List<SomeData>();

for (int i = 0; mSomedata.Count; ++i))
{
    if (mSomeData[i].Age > 18)
        mSomeData[i].Name += "Older"; // error CS1612
}

C++에서는 문제 없이 작동할법한 코드지만 C#에서는 아닙니다. 왜냐하면 인덱스를 통한 임의의 접근에서 반환되는 값이 복사된 값이기 때문입니다. 그렇기 때문에 해당 값을 변경하려고 하면 CS1612 컴파일 에러가 납니다. foreach를 이용할때도 마찬가지입니다 CS1654 컴파일 에러가 나며 읽기 전용 값을 수정하려고 한다며 에러가 나죠.


위와 같은 반복문 중에서 값을 변경하고 싶으면 아래와 같이 재할당을 해주어야 합니다.

for (int i = 0; mSomedata.Count; ++i))
{
    SomeData someData = mSomeData[i];
    if (someData.Age > 18)
    {
        someData.Name += "Older";
        mSomeData[i] = someData;
    }
}

참조 : https://msdn.microsoft.com/ko-kr/library/wydkhw2c.aspx


+ Recent posts