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

  • Liberator

    Liberator

    14 EYLÜL 2007
  • Tire Rack

    Tire Rack

    31 Mayıs 2007
  • TomSka

    TomSka

    30 Mayıs 2006