2010-01-02 15 views
9

dışı bir parametre kabul eden bir lambda veya anonim işlev yazın:Ben bir temsilci benim kodunda tanımladığınız

public bool delegate CutoffDateDelegate(out DateTime cutoffDate); 

ben temsilci oluşturmak ve bir lambda veya anonim fonksiyonu ile başlatmak istiyorum, ama bunların hiçbiri derlenmiş .

CutoffDateDelegate del1 = dt => { dt = DateTime.Now; return true; } 
CutoffDateDelegate del2 = delegate(out dt) { dt = DateTime.Now; return true; } 

Bunu yapmak için bir yol var mı?

+2

bilgilerin tahmin edilmez ama bunun bir kopya olduğunu düşünmeyin. Bağlantılı soru, anonim işlev içinde ana (?) Işlevinin parametresini kullanmakla ilgilidir; oysa bu, kendi parametresine sahip olan bir anonim işlevi bildirmekle ilgilidir. – Salvador

cevap

18

Sen lambda veya anonim temsilci sözdizimi birini kullanabilirsiniz - sadece argüman türünü belirtin ve olarak dışarı işaretlemek gerekir: Açıkça ref/çıkış beklendiği gibi argümanlar ilan ederken

public delegate bool CutoffDateDelegate(out DateTime cutoffDate); 

// using lambda syntax: 
CutoffDateDelegate d1 = 
    (out DateTime dt) => { dt = DateTime.Now; return true; }; 

// using anonymous delegate syntax: 
CutoffDateDelegate d2 = 
    delegate(out DateTime dt) { dt = DateTime.Now; return true; } 

derleyici normal olarak bunları çıkarabildiğinden, argüman türlerini lambda ifadesinde bildirmek daha az yaygındır. Bununla birlikte, bu durumda derleyici, lambda/anon ifadelerinde dış ve iç argümanlar için türden çıkarım yapmaz. Bu davranışın bir hata/gözetim olup olmadığına ya da bunun neden böyle olması gerektiğine dair bir dil sorunu varsa emin değilim, ancak yeterince kolay bir çözüm var. DÜZENLEME

: Ben VS2010 p2 hızlı bir onay yaptın ve argüman türlerini tanımlamak için var gibi hala görünüyor - bu tür eski farkına varın C# 4.

+4

Ne bir hata ne de bir gözetim olduğunu düşünmüyorum. Dışarıda veya ref parametresi olduğunu söylemek için açık olmalısınız. Neden sadece yazamazsın (dt) => ... 'başka bir meseledir. –

+1

Aslında bu benim kastettiğim şeydi - işaretleme işareti açıkça işaretlendi/ref değeri C# olarak bekleniyordu. Lambdalar için argüman türünü bildirmek daha az yaygındır, çünkü çoğu durumda derleyici türden çıkarım yapan mükemmel bir iş yapar. Daha net olması için yayınımı güncelleyeceğim. – LBushkin

+2

sadece bunun karşısında tökezledi - birden fazla parametreniz varsa, tüm ref/out olmasa bile, tüm türlerini açıkça beyan etmeniz gerektiğini unutmayın. – drzaus

İlgili konular