我认为这是一个捕获问题,但我没有做任何事情。试着在这里简化:
foreach (Question question in Test.Questions)
{
int id= question.id;
if(someIDictionary.TryGetValue(id, out value)
{
question.answerobject.number=someinteger;
}
else
{
question.answerobject.number=someotherinteger;
}
}
我尝试为问题对象设置临时值,但仍然无法正常工作。所有结果总是最后一次迭代值。
编辑: 每个问题对象中都会创建每个答案对象,因为问题是使用linq to sql创建的。那么问题将作为IList返回。
编辑2:如果我将值分配给另一个问题字段,则不会出现此问题。问题仅在于答案对象。对于所有问题(最后一项任务),答案对象的值都是相同的。
答案 0 :(得分:2)
你看到的问题是什么? “捕获”问题仅影响异步/延迟/线程代码 - 它不应影响这种情况。
我想知道这里最可能出现的问题是你的所有Question
个对象都有相同的answerobject
个实例 - 或者甚至你有很多次Question
个实例。
“捕获问题”的说明(见注释):这是使用lambda / anon方法时遇到的问题;如果在lambda / anon方法中使用了迭代变量(question
以上),它就会被“捕获” - 但是会以一种略微反直觉的方式......
例如;我们可能希望这打印(以不可预测的顺序)数字0-9:
int[] vals = {0,1,2,3,4,5,6,7,8,9};
foreach(int i in vals) {
ThreadPool.QueueUserItem(delegate {
Console.WriteLine(i);
});
}
Console.ReadLine();
但它没有......我们通过添加一个额外的变量来修复它:
int[] vals = {0,1,2,3,4,5,6,7,8,9};
foreach(int i in vals) {
int tmp = i;
ThreadPool.QueueUserItem(delegate {
Console.WriteLine(tmp);
});
}
Console.ReadLine();
这是因为捕获变量的行为是由它们的词法范围决定的......迭代变量的范围比我们想要的要大一些。
答案 1 :(得分:0)
当创建对象时,answerobject.number(int?)被指定为“Null”时,似乎会出现此问题。如果我尝试在循环期间分配值,我会得到上面的问题。如果我在创建对象时分配一个整数,问题就消失了,然后我可以在循环期间添加新值。你能解释一下,因为我得不到它。