2012-02-27 142 views
2

我定義了一個叫做敵人的矩形列表,我試圖移動列表中的矩形並減少它們的X值,但是我收到一個錯誤「無法修改'我'因爲它是一個foreach迭代變量。「我想知道這有什麼問題,如果有正確的方法去做。在foreach循環中修改對象的值

 foreach (Rectangle i in enemies) 
     { 

      i.X --: 

     } 
+3

這聽起來像你正在使用一個邪惡的可變結構。別。 – SLaks 2012-02-27 19:45:55

+4

你有什麼對抗使他們成爲敵人的矩形? :/更重要的是,這是System.Drawing.Rectangle結構,它是你的自定義結構,還是_____? – 2012-02-27 19:47:19

+0

我想你是指XNA'Rectange'(這是一個Struct)而不是WPF Rectangle類,所以我添加了xna作爲標籤。 – 2012-02-27 19:47:46

回答

8

值類型是按值複製;這就是爲什麼他們被稱爲「價值類型」。當你這樣做時,你正在製作一個副本的矩形,然後變異副本。現在,foreach循環會產生一個不可變的副本,並告訴您無法更改它,這很好,因爲它只是捕獲了您的錯誤。如果你將這個改變變成了一個可變的副本,你可能很久沒有找到這個bug了。

你的敵人類型應該可能是一個引用類型,而不是一個值類型。有敵人包含一個矩形,而不是一個矩形。然後,您可以將參考中的矩形改爲敵人。

+1

雖然我同意Enemy應該可能是一個引用類型,但在XNA方面有一點小小的警告:如果你想在Xbox 360上運行,垃圾回收器是一個大問題,這就是爲什麼可變結構更爲常見那裏。試圖與許多敵人(例如,幾何戰爭)做一個遊戲可能是一個性能挑戰(儘管我認爲Object Pooling比可變結構更有意義)。 – 2012-02-27 21:09:13

+1

@MichaelStum:請記住,我猜測原始海報正在使用XNA,所以我添加了該標籤。這是有道理的,因爲在XNA中Rectangle是一個結構體,但OP仍然有一個很小的機會使用另一個結構體Rectangle?也許... – 2012-02-27 21:46:04

+0

不,你是正確的,假設它是XNA :)感謝所有幫助,我剛剛開始使用它。 – Sam 2012-02-28 15:27:45