문제
이 코드 (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
, 이 경우 반복 변수입니다.
구조물은 값 유형이지만 클래스는 참조 유형입니다. 그렇기 때문에 이것이 수업 일 때 컴파일하는 이유는하지만 구조물 일 때는 아닙니다.
@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은 실제로 설정할 수있는 속성이 없지만 사진을 얻습니다.
제휴하지 않습니다 StackOverflow