2008-12-21 20 views
5

Aşağıdaki yöntem derlenmiyor. Visual Studio, "Bir out parametresi, anonim bir yöntemle kullanılmayabilir" uyarısında bulunur. WithReaderLock(Proc action) yöntemi, bir delegate void Proc() alır.Anonim bir yöntem bloğunda bir out parametresi kullanarak nasıl engellenir?

public Boolean TryGetValue(TKey key, out TValue value) 
{ 
    Boolean got = false; 
    WithReaderLock(delegate 
    { 
     got = dictionary.TryGetValue(key, out value); 
    }); 
    return got; 
} 

Bu davranışı elde etmenin en iyi yolu nedir? (Lütfen threadafe sözlükleri hakkında tavsiyede bulunmaktan kaçının, bu sorunun genel olarak out parametresi problemini çözmesi amaçlanmıştır).

cevap

11
public bool TryGetValue(TKey key, out TValue value) 
{ 
    bool got = false;    
    TValue tmp = default(TValue); // for definite assignment 
    WithReaderLock(delegate 
    { 
     got = dictionary.TryGetValue(key, out tmp); 
    }); 
    value = tmp; 
    return got; 
} 

. Hatta 2.0, orada void Foo() delegenin sürü şunlardır: ThreadStart, MethodInvoker, vs - ama Action orijinal versiyonunda aksaklık için özür dilerim

+0

;-p takip etmek en kolay; –

+0

düzeltildi Görmek için Action (T obj) 'degegate geçersiz. NET, ancak bu _on_ bir nesne çalışır. İşlemlere _around_ bir eyleme ihtiyacım var. Bu nedenle, delege Proc() 'geçersiz. Buna tutarlı olabilmek için “Action” (geçersiz) delegesi diyebilirim. –

1

Basit bir çözüm, mantığı yöntemin içine kopyalamaktır. Ama sonra DRY prensibini esnetiyoruz ve her iki yöntemde de davranışı sürdürmeliyiz. Eğer insanlar daha bunu tanıyacağı beri, yerine kendi yuvarlanan Action temsilci kullanmak isteyebilirsiniz .NET 3.5 - (küçük hata düzenlenmiş) bilgi için

,

public Boolean TryGetValue(TKey key, out TValue value) 
{ 
    internalLock.AcquireReaderLock(Timeout.Infine); 
    try 
    { 
     return dictionary.TryGetValue(key, out value); 
    } 
    finally 
    { 
     internalLock.ReleaseReaderLock(); 
    } 
} 
İlgili konular