2015-06-15 155 views
0

關於下列擴展方法:當通用參數類型必須爲擴展方法明確指定時,有哪些規則?

public static class Extensions 
{ 
    public static void P<T>(this T value) { } 

    public static TResult F<T, TResult>(this T value) 
    { 
     return default(TResult); 
    } 
} 

當我嘗試用不同類型的參數選項使用這些,我得到如下結果:

1.P(); // Compiler just fine 
1.P<int>(); // R# says "Type argument specification is redundant" 
var x = 1.F<int, int>(); // Compiler just fine 
var y = 1.F<int>(); // Compiler error: Incorrect number of type parameters 

那麼怎麼來的編譯器可以推斷類型TP,但不能推斷出相同的F?圍繞這種推理的規則是什麼?有沒有一種方法可以避免需要指定這樣的類型?

+0

'這個T值'是你通過的任何類型。 - >'1.P ();' - >'1'已經是整數 –

+0

@ T.S。,是的,我明白了。我不明白的是爲什麼這不適用於'1.F'。爲什麼'int'推斷爲'P'而不是'F'? –

+0

你在'F'中有完全不同的問題 - 這是一個通用函數,無法映射 –

回答

1

C#5.0規範的第7.5.2節涵蓋了類型推斷,並且通過了所有確定類型推斷何時可以和不可能成功的規則。

至於你的兩個例子,第一種情況是有一個正在被推斷的類型的參數,它允許它被推斷,而在你的第二個例子中你有一個沒有上下限的類型參數,因爲沒有參數以任何形式使用該類型,允許將上限或下限應用於它。

請注意,無法推斷方法的一些泛型類型參數,但不是全部。要麼他們都可以推斷出來,要麼全部都必須明確提供,這就是爲什麼當爲期待兩個方法的方法提供一個泛型類型參數時出現錯誤的原因,即使其中一個可能被推斷。

+2

*「沒有上限或下限」*是什麼意思? –

+0

@YuvalItzchakov推理算法根據它們在參數中的使用方式,在泛型類型參數上應用上下限,並根據每個類型參數的界限,類型推斷成功或失敗。 – Servy

+0

僅供參考如果您使用的是VS 2013,那麼您的PC上的「Program Files(x86)\ Microsoft Visual Studio 12.0 \ VC#\ Specifications \ 1033」 – DrewJordan

相關問題