In this example, I\'m attempting to pass by value, but the reference is passed instead.
for (int i = 0; i < 10; i++) { Thread t = new Thread(() =>
You definitely want to read Eric Lippert's "Closing over the loop variable considered harmful":
In Short: The behavior you see is exactly how C# works.