2016-09-21 5 views
-1

私はIResult<TResult>汎用クラスとサブクラスSuccess<TResult>Failure<TResult>は成功/失敗結果と関連情報を表すために使用します。C# - クラス名、インスタンスメソッドの構文とvs静的構文で修飾せずに呼び出す拡張メソッド

public static class SuccessExtensionsClass 
{ 
    public static BuildSuccess<TResult> Success<TResult>(this TResult result) 
    { 
     return new Success<TResult>(result); 
    } 
} 
:(それは TResultがちょうどクラスの場合には簡単ですが、ジェネリック医薬品が入れ子になっていた場合に非常に醜い取得します)すべての場所での一般的なパラメータの面倒な繰り返しを削減するために、私は建物を支援する拡張メソッドを持っています

今、私のような何かを行うことができます:

TResult blah = new TResult(); 

その後、

return blah.BuildSuccess(); 

これまでのところは良いです。必要に応じて、汎用メソッドを拡張メソッドに渡す必要はありません。私は、構文を使用した場合

はしかし、:

BuildSuccess(blah) 

私は不足しているジェネリック型パラメータのコンパイラエラーを取得します。

SuccessExtensionClass.BuildSuccess<TResult>(blah) 
正常に動作します

:さて、一方で、私はそれを変更した場合:私は、通常の静的メソッドと同じようにクラスを指定するまで

BuildSuccess<TResult>(blah) 

それは方法を見つけることができませんします:

SuccessExtensionClass.BuildSuccess(blah) 

なぜですか?あるいは、具体的には、この選択に何が動いたのですか? BuildSuccess(blah)として呼び出されたときに不足しているジェネリック型に関するエラーが非常に明確になるため、コンパイラは両方の場合で同じ情報を利用できます。エクステンションメソッドがエクステンションの構文でクラス名に修飾されていないと呼び出せないようにするのは設計上の選択ですか?これは単なるコードの明確さのためですか、私が考えていない別の理由がありますか?

フォローアップとして、静的な構文が、名前空間を明示的にインポートした場合にコンパイラが名前解決を行うインスタンスメソッドの構文と同じ規則に従わないのはなぜですか?うまくいけば、より明確にするため

編集

blah.SuccessExtensionsClass.BuildSuccess() 

が、静的な構文で私は必要性を行う:インスタンス構文で、私のように拡張メソッドを呼び出す必要はありません

SuccessExtensionsClass.BuildSuccess(blah) 

これを明示的に適用するのは簡単ですか?

blah.BuildSuccess() 

+0

Eric Lippert(または他のコンパイラチームのメンバー)がチャイムインすることを決定していないか、またはこれがなぜ行われたのかを明確に説明する偶然のブログ投稿が見つかった場合は、具体的な答えではなく、最良の推測しかできません。 –

+0

確かに、投稿の私の希望は、エリックか理論的根拠を知っている誰かが実際にチャイムすることです。 – David

+0

申し訳ありませんが、私は混乱しています...あなたは適切に拡張メソッドを使用していますが、 BuildSuccess(blah) '?これは 'BuildSuccess'が定義されているところでのみ動作します。拡張メソッドは普遍的なメソッドではありません。 – Will

答えて

関連する問題