2016-12-06 53 views
-1

我有一個非常簡單的擴展方法泛型類型(它可能是無關緊要的,雖然它是延伸和將是普通的人一樣):無法推斷如果返回它

public static T Content<T>(this HttpResponseMessage response) 
{ 
    var content = (ObjectContent<T>) response.Content; 
    return (T) content.Value; 
} 

現在我使用它像即:

MyContent content = response.Content(); 

但我得到的類型不能從使用推斷的錯誤,所以我必須這樣做:

MyContent content = response.Content<MyContent>(); 

這只是一個缺失的功能,它不能推斷或我在這裏做錯了什麼?我沒有看到任何問題推斷T類型MyContent即使沒有明確說明,雖然當然我沒有編寫編譯器,並不知道所有的細節。

+1

如果你不給它一個類型參數,它將如何知道它需要使用哪種類型?我不明白... –

+0

當知道的所有內容都是提供的'HttpResponseMessage'類型的response'時,編譯器應該如何知道你指的是MyContent?我假設你將* run-time *與* compile-time *混合在一起,其中泛型在編譯時起作用。 – HimBromBeere

+0

@ rory.ap - 通過從左邊的類型推斷它 – Lee

回答

3

我沒有看到推斷T是類型MyClass的,即使沒有明確地這樣說

那麼任何問題,問題是語言不是指定的方式在所有。泛型類型推斷是基於參數執行的。方法調用表達式是一種總是具有類型的表達式 - 並且解析正在使用哪種方法重載以及泛型類型參數是建立該類型的一部分。如何使用結果只是而不是重載分辨率或類型推斷的一部分。

是從匿名函數,方法和組null文本執行轉換時使用 - 這些都是不具有類型本身表達式,但僅僅是轉換爲適當的類型。

簡而言之,您需要指定類型參數。

請注意,您不需要編寫編譯器來獲取所有細節 - 這就是語言規範的用途。最近發佈的規範是C# 5

+0

有什麼理論上阻止編譯器推斷類型?或者它只是沒有爲C#做? –

+0

@IlyaChernomordik:這不是編譯器的問題,它是語言設計的問題。這種變化會使語言變得更加複雜 - 想象我們不只是調用方法並將它分配給一個變量,而是將它作爲一個調用傳遞給另一個返回相同類型的泛型方法......這裏有成爲整個推論鏈。我很高興編譯器*不*這樣做。類型推斷已經足夠毛病了,沒有這種事情。 –

+0

感謝您的回答,我明白這是一個語言設計問題。我真正的意思是:是否有任何阻止這種推斷的理論(不是實際問題)?或者它實施太複雜/容易出錯/耗時? –