2016-12-06 5 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'型の'応答 'であるときに' MyContent'を参照していることをどのように知っていますか?コンパイル時にジェネリックが動作する*コンパイル時*とランタイム*を混在させると仮定します。 – HimBromBeere

+0

@ rory.ap - 左側の型から推測することによって – Lee

答えて

3

私はTが明示的にまあそう

言わずにMyClassのにもタイプであることを推測しても問題が表示されない、問題は言語が全くそのように指定されていないということです。引数に基づいて汎用型推論が実行されます。メソッド呼び出し式は、常に型を持つ一種の式であり、どのメソッドのオーバーロードが使用されているかを解決し、汎用型の引数はその型を確立するためのものです。結果がどのように使用されるかは、単にではなく、オーバーロードの分解能または型推論の部分であるです。これらは、自分自身で型を持っていない表現ですが、適切な型に単に転換している - それ

は無名関数、メソッドグループやヌルリテラルからの変換を実行する際に使用です。

短いストーリーを短縮するには、型引数を指定する必要があります。

すべての詳細を取得するためにコンパイラを記述する必要はないことに注意してください。これが言語仕様です。最新の仕様はC# 5です。

+0

コンパイラが型を推論するのを理論的に妨げることはありますか?それとも、単にC#のために行われていないのですか? –

+0

@IlyaChernomordik:コンパイラの問題ではなく、言語設計の問題です。その変更は、言語をずっと、ずっと複雑にするでしょう - メソッドを呼び出して変数に割り当てるだけでなく、同じ型を返す別の汎用メソッドへの呼び出しとして渡すことを想像してみてください。推論の全体の鎖であること。私はコンパイラ*がこれをしないと心から喜んでいます。タイプ推論は、この種のものがなければ、すでに仕様の毛深いビットです。 –

+0

答えをありがとう、私はそれが言語の設計の問題であることを理解しています。私が本当に意味していたのは、このタイプの推論を防ぐ理論的な(実用的な問題ではない)ものはありますか?それとも、複雑すぎる/エラーを起こしやすい/実装するのに時間がかかりましたか? –

関連する問題