gpt4 book ai didi

c# - Foreach 循环将迭代变量传递给带有和不带 ref 的方法 - 不明白为什么它不允许使用 ref

转载 作者:行者123 更新时间:2023-11-30 21:28:27 26 4
gpt4 key购买 nike

<分区>

今天早上我一直在努力理解以下内容,我希望有人能很好地解释为什么这行不通。我在 LinqPad 上做了一个例子来复制我的问题:

void Main()
{
var myPeople = new People();
myPeople.MyPeople.Add(new Person { Name = "Joe", Surname = "Doe" });

foreach (var person in myPeople.MyPeople)
{
//this is intermediate variable is still a reference to the iteration variable
var intermediate = person;
myPeople.ChangeName(ref intermediate);

//both names were changed, so why cant i just pass in 'person' directly since its still changing it.

intermediate.Name.Dump();
person.Name.Dump();
}

}

public class People
{
public People()
{
MyPeople = new List<Person>();
}

public List<Person> MyPeople { get; set; }

public void ChangeName(ref Person person)
{
person.Name = "Changed";
}
}

public class Person
{
public string Name { get; set; }

public string Surname { get; set; }
}

所以 this post解释了 foreach 变量是一个只读变量,这就是为什么你不能用另一个替换它的原因 - 这是有道理的,但是如果我将它传递给 ChangeName 上面的方法ref,编译器不允许它 CS1657 .但是如果我删除 ChangeName 方法上的 ref 它将允许我传入 foreach 变量,但从技术上讲它仍然是一个 reference 没有明确说它是 ref 对吗?

那么为什么会这样呢?此外,如果我将它分配给上面的中间变量,那么它将允许我将它作为 ref 传递,即使它仍然是对原始文件的引用,所以技术上指向相同的内存位置,这意味着同一个对象对吗?

所以我的问题实际上是为什么 C# 编译器不允许我将迭代变量传递给带有 ref

的方法

Rafalon 对问题的进一步澄清:为什么当 person 变量指向与 intermediate 变量相同的对象时,编译器不允许 myPeople.ChangeName(ref person) 但允许 myPeople.ChangeName(ref intermediate)?

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com