2017-02-22 109 views
9

我在兩個不同的機器上運行下面的程序:靜態類中的匿名方法是非靜態的?如何調用它?

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

在一臺機器,用.NET 4.5和Visual Studio 2012安裝在此打印「真」,在一個又一個,使用.NET框架4.6.2並在Visual Studio 2015中打印「false」。

我認爲匿名方法是靜態的,如果它們是在靜態上下文中定義的。在最近的一些框架更新期間是否發生了這種變化(以書面形式)?

我需要做的是在lambda.GetMethodInfo()上使用Expression.Call,而在非靜態情況下,這需要一個定義lambda的實例。 如果我想用lambda.GetMethodInfo().Invoke我會面臨同樣的問題。

我怎樣才能得到這樣一個實例?

+0

但是你的目標是什麼?預期的結果是什麼? –

回答

9

請記住,這(lambdas)是一個編譯器功能,所以運行時框架版本不會有所作爲。此外,,因爲這是一個編譯器功能,2012年和2015年(當引入Roslyn,取代了大部分現有編譯器基礎結構時)之間的差異並不令人驚訝。

我不能給它爲什麼會一直在這裏具體改變了堅實的理由(雖然我知道一些改動作了啓用編輯並繼續在更多的環境工作),但它從來沒有合同約lambda是如何實現的。

我該如何得到這樣一個實例?

嘛,lambdaDelegate,而且總是暴露Target財產當代表是如此綁定後它引用的實例。

+0

就是這樣,謝謝。根據你的回答,我在Roslyn github上找到了一些文檔。這似乎是一個性能改進:https://roslyn.codeplex.com/workitem/246 – Jens

0

我怎樣才能得到這樣的實例

我不知道它的事項?當然,你可以運行簡單地這樣做(例如)lambda函數

Console.Print(lambda());

因此,事實上,它是靜態的或不主要是無關緊要的。

+0

我需要使用'Expression.Call',我不能只是簡單地調用它。 – Jens

+0

@Jens夠公平的 – SpaceUser7448