forとforeach

C#はreadonly。
C#,Java両方とも変更が反映される。
しらなんだ。

// C#
class X
{
    public String hoge;
}

[Test]
public void TestForeach()
{
    List<X> l = new List<X>();
    l.Add(new X());
    foreach (X x in l)
    {
        x.hoge = "hoge";
    }
    Assert.AreEqual("hoge", l[0].hoge);

    foreach (X x in l)
    {
// コンパイルエラーになる
//                x = new X();
        x.hoge = "hoge";
    }
    Assert.AreEqual("hoge", l[0].hoge);
}
// java
class X
{
    public String hoge;
}

public class ForTest extends TestCase {
  public void test() {
    List<X> l = new ArrayList<X>();
    l.add(new X());
    for(X x : l) {
      x.hoge = "hoge";
    }
    assertEquals("hoge", l.get(0).hoge);
  }
  public void test2() {
    List<X> l = new ArrayList<X>();
    l.add(new X());
    for(X x : l) {
      x = new X();
      x.hoge = "hoge";
    }
    assertNull(l.get(0).hoge);
  }
}