2013-03-29 43 views
5

+ = notasyonu kullanmadan bir temsilci için yeni bir işlev nasıl eklenir?C# temsilcisini ekleme #

Başka bir CLR borcundan, yani F # dan nasıl yapıldığını merak ediyorum. (Ben F # olaylar ile başa çıkmak için çok daha güzel bir yolu vardır biliyor ama merak oluyorum ..)

static int Square (int x) { return x * x; } 
static int Cube(int x) { return x * x * x; } 
delegate int Transformer (int x); 

Transformer d = Square ; 
d += Cube; 

Düzenleme

olarak açıklamalarda bulunan Daniel tarafından işaret, aslında bir o Bunun doğrudan bir yolu yoktur, muhtemelen dotnet ekibinin kuyruğu çok fazla değiştirmemesi için bir tasarım kararıdır.

+0

Eğer 'F #' cevap istiyorsun? –

+0

neden olmasın, en azından + = sözdizimsel olmayan şeker – nicolas

+0

sadece, soru başlığında bir C# başlığı var –

cevap

6

İşte bunu F # içinde yapmanın bir yolu. Sen nedeniyle Delegate.Combine kullanımına downcasting gerek:

let square x = x * x 
let cube x = x * x * x 

type Transformer = delegate of int -> int 

let inline (++) (a: 'T) (b: 'T) = 
    System.Delegate.Combine(a, b) :?> 'T 

let d = Transformer(square) 
let e = d ++ Transformer(cube) 
+0

evet, gördüğüm tek şey bu. Bu yazının avantajı, kendimize sağlamak zorunda olduğumuz tip güvenliği sağlamaktır. – nicolas

2

Delegate.Combine?

d = (Transformer) Delegate.Combine(d, new Transformer(Cube)); 
+0

gerçekten. tek yol .. şimdi bunu güvenli bir şekilde paketlemek için, cf pad'in cevabı. – nicolas