היי אופיר,
מודפס 10 פעמים המספר "10" מכיוון שהמשתנה i הוא Captured. ז"א, כאשר אתה ניגש אליו ב- Lambda expression לא נוצר העתק שלו עם הערך הנוכחי באיטרציה, אלא ממש reference אליו. וכאשר אתה מריץ את ה- foreach, הערך של המשתנה i הוא כבר 10. מכיוון שלכל
ה- Lambda Expressions יש reference לאותו משתנה, והערך של המשתנה הוא "10", זה מה שיודפס.
אם תרצה להדפיס מ- 1 עד 10, אז תוכל לשמור משתנה לוקלי:
for (; i < 10; i++)
{
var j = i;
printers.Add(delegate { Console.WriteLine(j); });
}
שים לב למשתנה j שנוצר פה. הוא גם המשתנה שמעבירים ל- Lambda Expression (במקום i). מכיוון שבכל איטרציה נוצר משתנה חדש עם ערך ספציפי, הפלט יהיה המספרים מ- 0 עד 9.
כאן תוכל לקרוא עוד על Capturing:
https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/statements-expressions-operators/lambda-expressions