I have a class like this:
class MyClass { public object[] Values; }
Somewhere else I'm using it:
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
I thought it will returns S
, but it throw exception. Any idea what is going on?
To see what's going on, change your lambda to maps.Add(obj => i);
.
With that change result
will be 3
, and that's why you're getting IndexOutOfBoundException
exception: you're trying to get myInstance[3]
which does not exist.
To make it work, add local int
variable within your loop and use that one as index instead of loop counter i
:
for (int i = 0; i < myInstance.Values.Length; i++)
{
int j = i;
maps.Add(obj => obj.Values[j]);
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.