«ClosureAndForeach» (Решение)
Ответ
В старых версиях компиляторов: 3 3 3.
В новых версиях компиляторов: 1 2 3.
Объяснение
В старых версиях компиляторов приведённый код превращался в следующую конструкцию:
public void Run()
{
var actions = new List<Action>();
DisplayClass c1 = new DisplayClass();
foreach (int i in Enumerable.Range(1, 3))
{
с1.i = i;
list.Add(c1.Action);
}
foreach (Action action in list)
action();
}
private sealed class DisplayClass
{
public int i;
public void Action()
{
Console.WriteLine(i);
}
}Таким образом, все три элемента списка на самом деле являются одним и тем же делегатом, поэтому в консоли мы увидим три одинаковых значения, равных последнему значению i.
В современных версиях компиляторов произошли изменения, новый вариант кода:
Теперь каждый элемент списка ссылается на собственный делегат, так что все полученные значения будут разными.
Примеры:
Ссылки
Last updated
Was this helpful?