2010-02-25 28 views
6

, böylece gibi bir şey yazabilirsiniz ... küme parantezleri tüm ifadeleri yürütülmesi ve son değer dönen varsayılan davranışı vardı bir derleyici yazdı C# ile eşdeğer bir şey? Örneğin, bir yan etkiye sahip bir lambda fonksiyonu yazmak istersem. lambda yan etkisi (sadece bir örnektir) bu işlevselliği varsa, daha ... lisp örneğin, sen prognC okula içerisinde kapsam operatörü

cevap

7

olmalı, Vlad dan yanıt doğru ve siz lamda işlev bildirmek gerekmez önceden bir delege. derleyici sözdizimsel lambda ifade bir temsilci (örn Func<int>) ya da bir ifade ağacı (örn Expression<Func<int>>) olarak derlenmiş ve ayrıca gerekip gerekmediğini karar veremez çünkü hariç

durum, C# gibi basit değil, herhangi biri olabilir diğer uyumlu delege türü.

: - C# derleyicisi otomatik olarak temsilci türünü tahmin edecek yöntemden sadece temsilci döndüren bir yöntem tanımlayan ve daha sonra arayarak kod biraz kolaylaştırabilirsiniz

int foo = new Func<int>(() => { 
    Console.WriteLine("bar"); return 1; })(); 

: Yani, temsilci oluşturmanız gerekir

static Func<R> Scope<R>(Func<R> f) { return f; } 

// Compiler automatically compiles lambda function 
// as delegate and infers the type arguments of 'Scope' 
int foo = Scope(() => { Console.WriteLine("bar"); return 1; })(); 

Bunun, :-) kullanılmaması gereken çirkin bir hile olduğunu kabul ediyorum, ancak bunun yapılması ilginç bir gerçektir!

7

sahip yan etkileri bulunduğu bilinen alıkoyan şey yok hakkında olmanın

nokta az

bir lambda ifadesi.

Func<int> expr =() => 
{ 
    Console.WriteLine("bar"); 
    return 1; 
}; 
int foo = expr(); 
5
int foo = (() => { printf("bar"); return 1; })(); 

Düzenleme: yapıcı eleştiri için teşekkürler, bu Prensip olarak

int i = ((Func<int>)(() => { printf("bar"); return 1; }))(); 
+5

Doğru cevap bu - dedi, bunu ciddi olarak düşünmüyor. –

+2

Siz, oylamadan önce kodun derlenip derlenmediğini gerçekten kontrol etmek isteyebilirsiniz. Bu yapmaz. -1. – Aaronaught

+0

Evet, evet, printf, C# içinde yok. Ama cevap bununla ilgili değil. – Vlad

3

Bir lambda tanımı için ()=>{M();}'dan bile daha kısa bir sözdizimi yapmayı düşündük, ancak her ikisi de güzel okuyan ve bloklarla, toplama/nesne başlatıcılarıyla kolayca karıştırılmayan bir sözdizimi bulmayı başaramamıştık veya dizi başlatıcıları. Şimdilik lambda sözdizimi ile sıkıştın.