In what cases foreach uses a ref, and in what cases foreach uses a copy?
using System;
using System.Linq;
class A {
public int v;
}
class Program
{
static void Main() {
var ints = new int[] { 0, 1, 2 };
var array = ints.Select(i=>new A {v = i}).ToArray();
foreach(var a in array) {
a.v = 999;
}
var enumerable = ints.Select(i=>new A {v = i});
foreach(var a in enumerable) {
a.v = 999;
}
Console.WriteLine($"array.First = {array.First().v}");
Console.WriteLine($"enumerable.First = {enumerable.First().v}");
}
}
jdoodle.com/ia/Jce
Output:
array.First = 999
enumerable.First = 0
Seems that in foreach(var a in enumerable) {
a is copy not a ref, while in foreach(var a in array) {
a is a ref.
Can someone explain this?