4 Ocak 2009, Pazar
Neden lambda expression düz bir Temsilci parametre olarak verilen zaman dönüştürmelisiniz
Yöntem Sistemi.Windows.Formlar.Kontrol.Çağırmak(Temsilci yöntem)
Neden böyle bir derleme zamanı hatası verir:
string str = "woop";
Invoke(() => this.Text = str);
// Error: Cannot convert lambda expression to type 'System.Delegate'
// because it is not a delegate type
Henüz bu gayet iyi çalışıyor:
string str = "woop";
Invoke((Action)(() => this.Text = str));
Bu yöntem düz bir Temsilci bekler?
CEVAP
4 Ocak 2009, Pazar
Lambda ifade ya da bir temsilci ya da bir ifade ağacı dönüştürülebilir - ama bilmek zorundadırhangitür temsilci. Sadece imza bilmek yeterli değildir. Örneğin, ben varsayalım:
public delegate void Action1();
public delegate void Action2();
...
Delegate x = () => Console.WriteLine("hi");
Nesnenin x
için sevk beton türü ne beklenir ki? Evet, derleyiciolabiliruygun bir imza ile yeni bir temsilci türü oluşturur, ancak bu nadiren işe yarar ve hata kontrolü için daha az fırsat.
Eğer kolay Action
Control.Invoke
arama yapmak istiyorsanız, bu o kadar kolay bir şey Kontrol etmek için bir uzantısı yöntemi ekleyin:
public static void Invoke(this Control control, Action action)
{
control.Invoke((Delegate) action);
}
Bunu Paylaş:
Neden benim program tam olarak 8192 el...
Neden C-yakalama-değeri 0 x'in la...
C# 4.0: varsayılan değeri isteğe bağlı...
Neden dize Kaldırın() yöntemi parametr...
Nasıl Java 8 lambda parametre olarak a...