2017-02-12 6 views
2

メソッドの戻り値の型がメソッドを別のメソッドに渡すときに、オーバーロードのあいまいさが発生する可能性があることに驚きました。戻り値の型はシグネチャの一部ではないので、戻り値を変更すると以前は存在していなかった部分があいまいになる可能性があります。しかし、これはvoidとTaskの場合のようです。次のことを考えてみましょう:デリゲートに代入するときの戻り値とシグネチャの難易度 - Func <Task>対アクション

class Signature 
    { 
     static public void Overload(Func<Task> countasync) 
     { 
     } 
     static public void Overload(Action count) 
     { 
     } 
    } 

    void Decrement() { } 
    Task IncrementAsync() { return Task.CompletedTask; } 

    void TestSig() 
    { 
     Signature.Overload(this.IncrementAsync); // no compile time error 
     Signature.Overload(this.Decrement); // compile time error: this call is ambiguous 
    } 

は、2番目の呼び出しがあいまいにならないように、まだ最初の呼び出しを可能にしながら、過負荷引数の型を定義する方法はありますか?

答えて

1

いいえ、オーバーロードの解決方法を修正する方法はありません。

しかし、あなたは少し醜い呼び出しサイトのコードのコストであいまいさを取り除くことができます。

Signature.Overload(() => this.Decrement()); 

コンパイラが正しく、その場合には、過負荷を推測します。

+0

あいまいさの原因は、デリゲート型(メソッドシグニチャとは異なります)が戻り型とパラメータ型によって区別されるという事実によると思われます。 これは、たとえば、イベントハンドラの戻り値の型に基づいて異なるイベントタイプを持つことができるという点です。 –