2012-12-10 119 views
4
public delegate T GenDel<T>(); 

class Program 
{ 
    public static void genMet<T>(GenDel<T> d) { } 

    static void Main(string[] args) 
    {   
     genMet(new GenDel<string>(() => "Works")); 
     genMet(() => "Works"); 
    } 
} 

在上例中,泛型方法接收lambda表達式作爲參數(genMet(() => "Works");),並且從此lambda表達式方法可以推斷出參數類型。爲什麼通用方法不能推斷參數類型?

爲什麼不是方法也能夠推斷參數類型在下面的例子中,在那裏,而不是lambda表達式,我們通過一個委託實例作爲一個參數:

 genMet(new GenDel(() => "Doesn't work")); // Error: Using the generic type 'GenDel<T>' 
                // requires 1 type arguments 

回答

8

類型推斷僅應用於一般方法 ,而不是泛型類型或它們的構造函數。

+0

因此,如果這些方法的參數是封閉構造類型的實例,那麼泛型方法只能推斷參數類型?換句話說,GenMet方法的作用不是「告訴」GenDel委託什麼是GenDel的參數類型? – user1483278

+1

@ user1483278皮特認爲,'GenDel'永遠無法推斷出它的通用參數,因爲它是一個構造函數。它需要是一種推斷它的通用參數的方法。 – Servy

+0

對於遲到的回覆,我表示歉意。謝謝你們的幫助 – user1483278

4

在第二個示例中沒有類型推斷 - 您明確地給出要使用的委託類型。在這種情況下,您需要提供類型參數,因爲沒有非通用的GenDel類型。

相關問題