2016-08-17 4 views
3

を維持したい私は廃止したい、この古いメソッドのシグネチャがあります。あいまいなメソッド定義が、後方互換性

[Obsolete("This method has been replaced with one that uses an arguments object")] 
public static T PollUntilReady<T>(
    Func<T> functionThatMight503, 
    double minPollInterval = 0d, 
    double maxPollInterval = double.MaxValue, 
    double maxPollTotalTime = double.MaxValue); 

を私がするパラメータ引数を使用して、より前向きなバリエーションでこれを置き換えたいです将来的に追加することができるさまざまなオプション:オプションが指定されていない場合

public static T PollUntilReady<T>(
    Func<T> functionThatMight503, 
    PollingOptions pollingOptions = null); 

問題があり、コンパイラは、メソッド呼び出しがあいまいであることを不平を言います。 ( "呼び出しは以下のメソッド間で曖昧です...")

新しい機能の名前を変更したり、新しいメソッドの柔軟性(オプションのオプションオブジェクト)を損なうことなくこれを解決できる方法はありますか?

+1

'pollingOptions'パラメータとして' null'を渡します。 – DavidG

+2

最も簡単な方法は、オプションパラメータとして 'pollingOptions'を持たないことでしょう。代わりに 'PollingOptions.Default'オブジェクトなどを用意しておけば、簡単に呼び出すことができます。 – MAV

答えて

3

次の2つの機能の代わりとしてそれを実装することができます:それはすべてのデフォルトを必要としないから選択する機能を有しているので

のみ単一の引数で呼び出さ
public static T PollUntilReady<T>(Func<T> functionThatMight503) 
{ 
    return PollUntilReady(functionThatMight503, null); 
} 

public static T PollUntilReady<T>(
    Func<T> functionThatMight503, 
    PollingOptions pollingOptions) 
{ 
    throw new NotSupportedException(); //Whatever 
} 

は、コンパイラはあいまいさを解決することができます。

pollingOptionsのデフォルト値が呼び出しコードではなくコードに焼き込まれることを意味します。つまり、デフォルト値を後で変更すると、再コンパイルなしでも古いコードが新しい既定値を受け取ることになります。


これは、オーバーロードの解決ルールに曖昧さのおかげで回避:デフォルト引数が少なくとも一つのオプションのパラメータに代入する必要があるのに対し、M Pのすべてのパラメータは、対応する引数を持っている場合、それ以外の場合は

をM Qは、M PはM Q

よりも優れています

C#言語仕様のセクション7.5.3.2から。

+0

なぜ私はこれを考えなかったのか分からない。あなたは私の救い主です。 – Alain

+0

最初のバリエーションはオリジナルとあいまいではありませんか? (私はテストしようとしていますが、なぜそれができないのか分かりません) – Alain

+1

@Alain - 仕様から引用して更新されました。また、私は実際にこれらすべての定義を自分のスクラッチプログラムに入れて、これらの新しいメソッドの有無にかかわらず、さまざまなテストケースがコンパイルされていることを確認しました。 –

1

唯一の方法は、あいまいなメソッド定義を持つ可能性を排除する必要があることです。既定でpollingOptions = null を設定する代わりに、常に何かを渡す必要があります。

だからあなたのメソッドのシグネチャは、これに変更します。

public static T PollUntilReady<T>(
    Func<T> functionThatMight503, 
    PollingOptions pollingOptions); 

あなたがpollingoptionsまたはnullを渡す必要があなたの新しいメソッド定義のそれぞれで独立し使用するには。

あなたがオプションのargsを妥協しないように頼んだとしても、唯一の方法です。

関連する問題