2010-02-12 12 views
6

ben aşırı yüklenmiş bir yöntemle bir sınıf vardır:Muğlak Çağrı

MyClass.DoThis(Action<Foo> action); 
MyClass.DoThis(Action<Bar> action); 

ben Eylem sürümüne lambda ifade geçmek istiyorum: Maalesef

MyClass.DoThis(foo => foo.DoSomething()); 

, Görsel Studio, "foo" değişkenini çevreleyen tür çıkarımı nedeniyle Action<Foo> ve Action<Bar> sürümleri arasındaki farkı tam olarak söyleyemez ve bu nedenle bir derleyici hatası oluşturur:

The call is ambiguous between the following methods or properties: 'MyClass.DoThis(System.Action <Foo>)' and 'MyClass.DoThis(System.Action <Bar>)'

Bunun için en iyi yol nedir?

cevap

23
MyClass.DoThis((Foo foo) => foo.DoSomething()); 
2

Derleyicinin bunu tek başına çözmesi mümkün değildir. Çağrı gerçekten belirsizdir ve bir şekilde derleyici için istediğiniz aşırı yükü netleştirmek zorunda kalacaksınız. Aşırı yük çözünürlüğünde "foo" parametre adı önemsizdir. Bu çok daha ayrıntılı bir lambda daha

MyClass.DoThis(delegate(Foo foo) { 
    foo.DoSomething(); 
}); 

:

MyClass.DoThis(new Action<Foo>(foo => foo.DoSomething())); 
0

bildiğim yolu bir eski tarz temsilci kullanmaktır. Bu konuda emin olmasam da, bir ifade ağacı istiyorsan işe yaramayacağından da endişeliyim.