2017-02-22 13 views
9

İki farklı makinelerde aşağıdaki programı çalıştırıyorum: .NET 4.5 ve Visual Studio 2012 ileStatik sınıftaki anonim yöntem statik değil midir? Nasıl çağırılır?

bir makinede
static class Program 
{ 
    static void Main(string[] args) 
    { 
     Func<int> lambda =() => 5; 
     Console.WriteLine(lambda.GetMethodInfo().IsStatic); 
     Console.ReadLine(); 
    }   
} 

, bu .NET Framework 4.6.2 ile başka birinde, "gerçek" yazdırır yüklü ve Visual Studio 2015 "false" yazdırır.

Anonim yöntemler statik bir bağlamda tanımlanmışlarsa statik olduklarını düşünmüştüm. Son çerçeve güncellemelerinde bu değişiklik (belgelenmiş bir şekilde) yapıldı mı?

Yapmam gereken şey, Expression.Call'u lambda.GetMethodInfo() üzerinde kullanmaktır ve statik olmayan durumda bu, lambda'nın tanımlandığı bir örneği gerektirir. lambda.GetMethodInfo().Invoke kullanmak istesem de aynı sorunla karşılaşırdım.

Böyle bir örneği nasıl alabilirim?

+0

Ama amacınız nedir? Beklenen sonuç nedir? –

cevap

9

Bunun (lambdas) bir derleyici özelliği olduğunu unutmayın, böylece çalışma zamanı çerçevesi sürümü bir fark yaratmaz. Ayrıca, , bu bir derleyici özelliğidir, 2012 ile 2015 arasında bir fark olması şaşırtıcı değil (Roslyn'in mevcut derleyici altyapının çoğunun yerini aldığı zaman).

Ben burada özellikle değiştirilmiş neden için sağlam bir neden söylemezsen, ancak sözleşmeli hakkında olmamıştı (ı yapılmıştır çeşitli değişiklikler bilmeme rağmen daha bağlamlarda çalışmak için Düzen-ve-Devam etkin) lambdas nasıl uygulanır.

Böyle bir örneği nasıl alabilirim?

Eh, lambda bir Delegate olduğunu ve her zaman temsilci öylesine bağlı olduğunda bir örneğini başvuran bir Target özelliği maruz kaldığı.

+0

İşte bu, teşekkürler. Cevabınıza dayanarak Roslyn github'da bazı belgeler buldum. Bu bir performans iyileştirmesi gibi görünüyor: https://roslyn.codeplex.com/workitem/246 – Jens

0

böyle bir örneğe alabilirim nasıl bu konularda emin değilim

? Eminim

Console.Print(lambda());

Yani statikse veya olmasın aslında büyük ölçüde önemsizdir basitçe (örneğin) yaparak lambda fonksiyonu çalıştırabilirsiniz.

+0

'Expression.Call' kullanmam gerekiyor, sadece basitçe arayamıyorum. – Jens

+0

@Jens yeterli – SpaceUser7448

İlgili konular