SORU
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ş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Digital Bounds

    Digital Boun

    19 Temmuz 2013
  • Goran Dimov

    Goran Dimov

    1 HAZİRAN 2014
  • Whizzpopping

    Whizzpopping

    10 Kasım 2005