2017-07-25 10 views
2

何らかの理由で私はJon Skeetがこれに対する答えを知っているに過ぎないと感じましたが、それは価値があります。なぜコードで書かれたアクションは明示的なパラメータ宣言が必要です

私はコマンドを生成するプロキシとして使用されるこのメソッドスタブを持っています。

public static void SetCommand<T>(string commandName, Action<T> execution) 
    where T : new() 
{ 
    //Omitted unimportant 
} 

私はこのコードを呼び出す関数を持っていますが、呼び出される方法によって動作が異なります。

私はパラメータのすべてが

Action<ClassDeclarationOptions> test = (t) => { }; 
SetCommand(GENERATE_CLASS_COMMAND, test); 

罰金を解決することができます明示的にアクションを宣言することで、コードを呼び出す場合、私は

public static void GenerateClass(ClassDeclarationOptions classOptions) 
{ 

} 

自分の行動を表現する関数を宣言した場合しかし、その後、私は明示的にする必要があり次のように関数に渡すときにパラメータを宣言します。

SetCommand<ClassDeclarationOptions>(GENERATE_CLASS_COMMAND, Commands.GenerateClass); 

コンパイラはのは、異なるパラメータの型を取るCommands.GenerateClassの過負荷とは、例えば、そこだとしましょうメソッド定義から

+1

異なるパラメータタイプをとる 'Commands.GenerateClass'に過負荷があるとすれば、コンパイラはどちらを使用するかを判断する方法がないとします。 – DavidG

+0

@DavidG良い点私はそれを考えなかった。それを投稿して回答があれば、私はそれを正しくマークします –

+0

もちろんその他の理由があるかもしれませんが、これが最初に思い浮かぶのです。 – DavidG

答えて

3

を私の一般的なパラメータを解決できない理由を誰かが説明することができます:

public static void GenerateClass(SomeOtherClass stuff) 
{ 
} 

は今、コンパイラのための方法はありませんどのGenerateClassメソッドを使用するかを調べます。しかし、型パラメーターを指定するとすぐに、あいまいさがなくなります。

したがって、単一のメソッドがあり、コンパイラが型引数を推論したとしても、その2番目のメソッドを後で追加して、それを実現することなく既存のコードを破ることができます。コードを明示的に強制するほうがずっと安全です。

+0

パーフェクト、期限が過ぎるとこれを受け入れます! –

関連する問題