2011-12-09 87 views
5

如果我有方法速記調用C#泛型方法時

void foo<T>(T bar){} 

我可以成功地調用它是這樣的:

string s = string.Empty; 
foo(s); 

正如我想象中的編譯器/運行時可以推斷出類型,

但是如果我改變方法如下:

T foo<T,T2>(T2 bar){...} 

那我得把它稱爲「全」,同時指定輸入參數類型和返回值類型:

string s = string.Empty; 
foo<int,string>(s); 

有沒有一種方法,我可以這麼速記這個我不需要指定輸入參數(S)類型? I.E.

foo<int>(s); 

感謝

+0

爲了澄清「我想象中的編譯器/運行時可以推斷出類型」:在您的例子中,類型推斷是由編譯器處理。 – phoog

回答

3

你可以在你的方法總是改寫爲:

void foo<T, U>(U bar, out T baz) 
{ 
    baz = default(T); 
} 

,如果你真的想要的類型推斷......現在:

string s = string.Empty; 
int i; 

foo(s, out i); 

會工作得很好。

此外,請參閱:this question Eric Lippert爲您解答爲何不能滿足您的需求!

編輯:我知道我實際上並沒有回答你的問題......

有沒有一種方法,我可以簡寫本,所以我不需要指定 輸入參數(S)型?

簡而言之...號

3

不幸的是,有沒有辦法讓編譯器從使用的例子推斷T。只要不能自動完成,你需要提供它。

C#中沒有「可選」類型參數,沒有簡寫。

+0

這種推理不適用於表達式嗎?如果是這樣,爲什麼不使用方法? – Connell

+0

請您澄清一下,您在「使用表達式進行這種推理工作」下的含義。也許,你可以發表一個例子嗎? –

+0

我只是一直在努力,總會遇到編譯錯誤,無論我嘗試什麼,但我想到代表或lambda。功能不正確嗎? – Connell