문제

이 코드 (C#)가 있습니다.

using System.Collections.Generic;

namespace ConsoleApplication1
{
    public struct Thing
    {
        public string Name;
    }

    class Program
    {
        static void Main(string[] args)
        {
            List<Thing> things = new List<Thing>();
            foreach (Thing t in things) //  for each file
            {
                t.Name = "xxx";
            }
        }
    }
}

컴파일하지 않습니다.
오류 오차는 다음과 같습니다. 오차는 다음과 같습니다. 오차는 다음과 같습니다.

Cannot modify members of 't' because it is a 'foreach iteration variable'

내가 변하면 Thing a class a보다는 struct, 그러나 컴파일됩니다.

누군가 무슨 일이 일어나고 있는지 설명해 주시겠습니까?

도움이 되었습니까?

해결책

다소 말한 바에 따르면 컴파일러는 Foreach의 루핑 var를 변경할 수 없습니다.

간단히 사용 :

for(int i = 0; i < things.Count; i+= 1) //  for each file
{
    things[i].Name = "xxx";
}

그리고 그것은 언제 작동합니다 Thing 루핑 var는 참조이기 때문에 클래스입니다. 참조 자체가 아니라 참조 된 객체 만 변경합니다.

다른 팁

구조물은 참조 유형이 아니라 값 유형입니다.

당신이 가질 것이라면 class 대신 a struct ~을 위한 Thing, Foreach 루프는 귀하를위한 참조 변수를 생성하므로 귀하의 올바른 요소를 가리 킵니다. 그러나 가치 유형이므로 귀하의 사본에서만 작동합니다. Thing, 이 경우 반복 변수입니다.

구조물은 값 유형이지만 클래스는 참조 유형입니다. 그렇기 때문에 이것이 수업 일 때 컴파일하는 이유는하지만 구조물 일 때는 아닙니다.

더보기: http://www.albahari.com/valuevsreftypes.aspx

@henk의 솔루션보다 선호하는 대체 구문이 이것입니다.

DateTime[] dates = new DateTime[10];

foreach(int index in Enumerable.Range(0, dates.Length))
{
   ref DateTime date = ref dates[index];

   // Do stuff with date.
   // ...
}

루프에서 합리적인 양의 작업을 수행하는 경우 모든 곳에서 인덱싱을 반복하지 않아도 눈 IMO에서 더 쉽습니다.

PS DateTime은 실제로 설정할 수있는 속성이 없지만 사진을 얻습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top