2009-04-08 57 views
1

我認爲這是一個捕獲問題,但我沒有做任何工作。儘量簡化這裏:這是一個Capture問題嗎?我仍然無法解決

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創建的問題每個answerobject在每個問題對象中創建。那麼問題將作爲IList返回。

編輯2:如果我將值分配給另一個問題字段,則不會發生此問題。該問題僅與答案對象有關。答案對象的值對於所有問題(最後一項作業)都是相同的。

+0

小心解釋你在做什麼?代碼並不是很明顯。 – 2009-04-08 04:45:57

+0

如果字典中有問題ID,我對answerobject做了一定的分配... – zsharp 2009-04-08 04:49:49

回答

2

您看到什麼問題? 「捕獲」問題隻影響異步/延遲/線程代碼 - 它不應該影響這種情況。

我想知道這裏最可能出現的問題是,您的所有Question對象都具有相同的answerobject實例 - 或者甚至您有大量相同的實例Question實例。


「capture propblem」的插圖(請參閱註釋):這是使用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(); 

這是因爲捕獲變量的行爲是由它們的詞法範圍決定的......迭代變量的範圍有點大,我們希望。

0

當創建對象時answerobject.number(int?)被賦值爲「Null」時,會出現此問題。如果我嘗試在循環中分配一個值,我會遇到上述問題。如果我在創建對象時指定了一個整數,那麼問題就不存在了,於是我可以在循環中添加新的值。你可以向我解釋,因爲我沒有得到它。