[英]Accessing elements from a lambda expression in c#?
我想從 lambda 表達式訪問我的 WPF 元素。
這是我的簡化代碼:
public static class MyClass
{
public struct MyStruct
{
public Rectangle MyRectangle {get; set;}
public Button MyButton {get; set;}
public void MyVoid()
{
MyRectangle = new Rectangle();
MyRectangle.Width = 300;
MyRectangle.Height = 100;
MyGrid.Children.Add(MyRectangle);
MyButton = new Button();
MyButton.Widht = 200;
MyButton.Height = 200;
MyButton.Click += (a, e) =>
{
MyRectangle.Fill = Brushes.Red;
}
MyGrid.Children.Add(MyButton);
}
}
}
但是“MyButton.Click”中的 MyRectangle 存在錯誤:
結構中的匿名方法、lambda 表達式和查詢表達式無法訪問“this”的實例成員。
有人可以解釋如何解決這個錯誤嗎?
正如@Sean 所說,簡單的解決方法是將struct
更改為class
。
如果它必須是struct
,則需要將this
尊重為局部變量:
MyStruct self = this;
MyButton.Click += (a, e) =>
{
// Assuming Rectangle here is System.Windows.Shapes.Rectangle
self.MyRectangle.Fill = Brushes.Red;
}
我也可以給你一些關於錯誤的解釋:
錯誤是因為this
在struct
中有效地ref this
是一個指針,無法捕獲並存儲在Delegate.Target
中。
為了讓委托捕獲this
,您需要取消對局部變量的引用this
捕獲變量中的值。
但是,當您執行上述操作時,編譯器會創建一個防御性副本,這意味着self
是this
指向的結構的副本。 這意味着,雖然您仍然可以更改返回類型為引用類型的字段/屬性,但對self
實例本身以及返回值類型的字段/屬性所做的任何更改都不會反映在this
中。
您的解決方案對我不起作用。 為了解決這個問題,我刪除了匿名方法,並在“MyVoid”方法之外創建了另一個方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.