我想基於EventArg pictureBox1.Location.X = e.X;
的位置有些事件後設置控件的位置。廣東話設置control.Location.x到argumentEvent e.x
然而,這並不工作,它Cannot Modify expression because it is not a variable
。但我的印象是x座標是一個屬性,可以設置。這裏發生了什麼 ?
我想基於EventArg pictureBox1.Location.X = e.X;
的位置有些事件後設置控件的位置。廣東話設置control.Location.x到argumentEvent e.x
然而,這並不工作,它Cannot Modify expression because it is not a variable
。但我的印象是x座標是一個屬性,可以設置。這裏發生了什麼 ?
試試這個:
pictureBox1.Location = new Point(e.X, pictureBox.Location.Y);
,或者如果你不希望建立一個新的變量:
Point location = pictureBox1.Location;
location.X = e.X;
pictureBox1.Location = location;
這是因爲Point
是值類型,因此你不能只需編輯它的一個值,因爲它不會傳播。它的值被存儲,而不是對該值的引用。你不能編輯它,你需要再次構建對象。這可以編譯,但它絕對不會做任何事情,因此編譯器確保不會出現此錯誤。
OP似乎想知道爲什麼不是如何以及另一種解決方案是什麼。 –
@KingKing我已經解釋了爲什麼......你的意思是評論其他答案? –
你可以嘗試聲明一個變量'Point',看看你是否可以改變它的'X'和'Y'? –
因爲System.Drawing.Point
是值類型,當你調用pictureBox1.Location
,你實際上得到Point
的副本。一個全新的對象被構建並填充了pictureBox1.Location
的字段。
因此,編譯器試圖保護您免於做一些愚蠢的事情,因爲更改副本的值不會傳播到Location
的值。
因此,正如其他答案中所述,您應該構建新的Point
並將其分配給Location
屬性。
有人在這裏談論Point
是一種價值型,你不能改變它的X
和Y
,這種解釋會讓你很困惑。我在這裏發佈這個答案,以幫助你理解爲什麼你不能改變它的Location
。這是因爲Location
是Property
返回到Object
一個Structure
不是一個參考,如果你有一個字段,而不是,你可以改變這種方式,就像這樣:
public class YourControl : BaseControl {
public Point Location;
}
//Then you can change the Location your way:
yourControl.Location.X = ....
然而,正如我所說,Location
是Property
返回值類型(結構)的副本,如:
public class YourControl : BaseControl {
private Point location;
public Point Location {
get {
return location;//a copy
}
set {
location = value;
}
}
}
//So when you call this:
yourControl.Location
//you will get a copy of your Location, and any changes made on this copy won't affect
//the actual structure, the compiler needs to prevent doing so.
yourControl.Location.X = ... //Should not be executed...
這不是Location
唯一的情況下,可以在其中是值類型的所有其他屬性發現這個問題。
與上面相同的答案,但更具可讀性和可理解性。 – danShumway
請參閱[爲什麼是可變結構邪惡?](http://stackoverflow.com/q/441309/11683) – GSerg