2016-07-06 167 views
0

爲什麼第一個和第三個表達式工作但不是第二個?Lambda表達式返回類型問題

 var ss = new Func<int>(() => 0); //works 
     int x1 = new Func<int>(() => 0); //doesn't work --Cannot convert source type 'System.Func<int>' to target type 'int' 
     int x2 = new Func<string,int>((x) => 0)(""); //works 
+5

你基本上試圖把'Func '放在一個類型爲int的變量中;有一些錯誤;) – Sehnsucht

+0

'int x1 = new Func (()=> 0)();'會工作,因爲您然後調用函數表達式,得到0結果,然後將其分配給int。儘管如此,這與返回值並沒有多大關係,並且要注意,第一個作品是因爲您可以將任何內容分配給var。第三個原因是因爲您再次調用函數表達式(特別是使用字符串,因爲它期望)。 –

+0

@TravisJ我們不能把任何東西放在'var'; 「只」的類型可以(靜態地)從表達式中解析出來。例如'var foo = delegate(){return 0; };'不起作用 – Sehnsucht

回答

8

隨着

var ss = new Func<int>(() => 0); 

編譯器能夠正確地推斷出實際類型的ssFunc<int>Func<int>是一個可以調用並返回int的委託。所以:我們有

ss() == 0 // is true 

通知書,以便它調用ss這裏(例如ss())到回報int

所以知道我們從上面做,下面也不能正確

int x1 = new Func<int>(() => 0); 

,因爲你現在想一個函數/委託(等同於前一個)存儲到類型爲變量int。它是Func<int>類型的代表...與int非常不同,當調用/調用時,返回int

在這種情況下

int x2 = new Func<string,int>((x) => 0)(""); 

您聲明一個函數,採用一個字符串作爲參數,並返回一個int,然後立即調用它(提供未使用的空字符串,""作爲參數)。該函數然後返回int然後您存儲對x2

現在更有意義了嗎?

+0

是的!這是我不理解的調用部分。那麼,最簡​​潔的方法是:int x1 = new Func (()=> 0)();分配有兩部分 - lambda表達式,然後調用它,這是實際執行func.and返回我需要返回的。 非常感謝。 – Chris

0

你有沒有嘗試添加的返回類型的函數功能,像這樣,

int x1 = new Func<int, int>(() =<0); 

你會發現,這也將返回相同的錯誤。

var的工作原理是因爲var的值對於類型無關緊要。 C#是強類型的,因此對於intFunc預期的值類型爲int