C#在列表中迭代时设置对象的属性

Kei*_*ung 1 c# iteration properties

C#不允许我这样做.

foreach (Point point in filledPoints)
{
    point.X = 0;
} 
Run Code Online (Sandbox Code Playgroud)

filledPoints是一个List<Point> 它给了我一个编译器错误:"filledPoints是一个foreach迭代变量,因此无法编辑关联的成员"(对不起,该消息是德语,我很难翻译).但这有效:

foreach (Point point in filledPoints)
{
    Point point2 = point;
    point2.X = point2.X / oldSize.Width * Size.Width;
}   
Run Code Online (Sandbox Code Playgroud)

为什么这不起作用,是否有更优雅的方式绕过它?

Joe*_*yrp 6

这是因为Point不是引用类型(它是结构而不是类).所以foreach中的point变量实际上并不是对原始Point的引用,它是一个副本.编译器不允许你修改它,因为(我假设)当你不是时,很容易认为你正在改变原文.

我不确定是否有更好的方法,但你可以通过做这样的事情来解决这个问题:

for (int i = 0; i < filledPoints.Count; i++)
{
    Point temp = filledPoints[i];
    temp.X = 10;
    filledPoints[i] = temp;
}
Run Code Online (Sandbox Code Playgroud)