2010-10-01 29 views
0

你能幫我這裏,爲什麼編譯器不會推斷lambda輸入參數對嗎?C#方法覆蓋委託作爲參數,編譯器不會推斷輸入類型

例子:

void Test(Action<string> n) 
{ 
} 
void Test(Action<int,string> n) 
{ 
} 

好了,所以,當這樣做:

obj.Test(x=>{}); // compiler doesn't know x is a string 

如果我這樣做:

obj.Test((x,y)=>{}); // that works, compiler know x is a int and y is a string 

看來我必須指定的輸入參數類型( ?)

obj.Test((string x) => {}) // <-- Prefer not doing this 

因此,編譯器無法獲得正確類型的任何原因?

謝謝! Carlos

+0

我只能假設你有一個額外的'測試'方法,你沒有與我們分享。正如當我嘗試你的代碼時,我沒有得到任何問題,你的第一個選項,'obj.Test(x => {});'。 (vs2010,.net4) – 2010-10-01 17:05:12

+0

是的,也許你有另一種方法'測試(動作 n)'... – digEmAll 2010-10-01 17:15:18

+0

嗯,這很奇怪,我使用Visual Studio 2008,檢查屏幕截圖,你能看到缺少字符串屬性的智能感知? http://img690.imageshack.us/img690/9523/overr.png – carlosdubusm 2010-10-01 17:21:16

回答

0

我只是試圖重新與Visual Studio 2008的問題,在這裏做了截屏:http://screencast.com/t/YTAwNmQ4M

我是不是能夠重現問題。我曾經見過Visual Studio做過這樣的事情,但構建總是有效的,而且往往是內存問題。關閉Visual Studio以及其他可能佔用大量內存的程序,然後啓動Visual Studio備份常常有所幫助。

所以,基本上,我的答案是,「你是否嘗試開啓,然後再回來?」

+0

看起來像我的VS損壞了,當我把鼠標放在它所說的(參數)字符串x的參數上,但自動完成不顯示字符串的方法和屬性,啊,我不想重新安裝... – carlosdubusm 2010-10-01 17:54:47

+0

重新啓動機器,仍然是同樣的問題,無論如何,謝謝你。我想爲你們兩個都設置正確的答案,但我認爲這是不可能的。 – carlosdubusm 2010-10-01 18:03:02

0

看着你的截圖,問題很簡單。您的方法名稱Test與封閉類Test相同。這是不允許的,而事實上,你應該得到的編譯器錯誤:

'Test': member names cannot be the same as their enclosing type

+0

對不起,我寫得很快,用正確的名字看這個例子:http://img195.imageshack.us/img195/6766 /overrb.png – carlosdubusm 2010-10-01 17:33:10

+0

@carlosdubusm,嗯,對我而言不會發生:http://img835.imageshack.us/img835/9323/60539152.png(現在也使用vs2008) – 2010-10-01 17:39:02

+0

@carlosdubusm,這個問題,請嘗試調用其中一個應該存在的字符串方法,然後編譯它並查看編譯器錯誤是什麼。 – 2010-10-01 17:40:27