sách gpt4 ăn đã đi

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

In lại Tác giả: Walker 123 更新时间:2023-11-30 21:28:27 26 4
mua khóa gpt4 giày 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();
}

public List 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 上面的方法tham khảo,编译器不允许它 CS1657 .但是如果我删除 ChangeName 方法上的 tham khảo 它将允许我传入 foreach 变量,但从技术上讲它仍然是一个 reference 没有明确说它是 tham khảo 对吗?

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

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

的方法

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

26 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress