2013-12-23 8 views
6

私はこのようなクラスがあります。他にインデックスが配列の範囲外だった<機能<T,object>>

class MyClass { public object[] Values; } 

どこかに私はそれを使用しています:

MyClass myInstance = new MyClass() {Values = new object[]{"S", 5, true}}; 

List<Func<MyClass, object>> maps = new List<Func<MyClass, object>>(); 

for (int i = 0; i < myInstance.Values.Length ; i++) 
{ 
    maps.Add(obj => obj.Values[i]); 
} 

var result = maps[0](myInstance); //Exception: Index outside the bounds of the array 

私はそうなると思いましたSを返しますが、例外がスローされます。何が起こっているか考えてみませんか?

答えて

8

何が起きているのかを確認するには、ラムダをmaps.Add(obj => i);に変更してください。その変化result

3になり、あなたがIndexOutOfBoundException例外を取得している理由です:あなたは存在しないmyInstance[3]を取得しようとしています。

、それを動作させるあなたのループ内のローカルint変数を追加し、代わりに、ループカウンタiの指標として、そのいずれかを使用します。

for (int i = 0; i < myInstance.Values.Length; i++) 
{ 
    int j = i; 
    maps.Add(obj => obj.Values[j]); 
} 
+0

それでは、どのように私はそれが動作することができますか? –

+0

私は自分の答えを更新しました。 – MarcinJuraszek

+0

はい、問題は解決しました。 'i'値が参照値のように振る舞っている理由を説明できますか? –

関連する問題