2016-08-17 113 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

將'null'作爲'pollingOptions'參數傳遞。 – DavidG

+2

最簡單的方法可能是_not_不具有'pollingOptions'作爲可選參數。相反提供一個'PollingOptions.Default'對象或類似的東西,所以它仍然很容易調用。 – MAV

回答

3

可以實現它的兩個功能來代替:

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的所有參數具有相應的參數,而默認參數需要被取代的用於在至少一個任選的參數中號 Q則M P小於M Q更好

來自C#語言規範的第7.5.3.2節的

+0

不知道爲什麼我沒有想到這一點。你是我的救世主:) – Alain

+0

第一個變體是否會顯示爲與原始模糊不清? (我即將測試,只是不知道爲什麼它不會) – Alain

+1

@Alain - 更新了spec的報價。另外,我確實將所有這些定義放入了我的臨時程序中,並確保各種測試用例都可以在不使用這些新方法的情況下進行編譯。 –

1

我看到的唯一方法是您必須刪除具有模糊方法定義的可能性。默認情況下,您不需要設置pollingOptions = null ,您必須始終傳遞一些信息。

因此改變你的方法簽名是:

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

若要使用新的方法確定指標必須傳遞pollingoptions或空。

根據我的唯一方法,即使你要求不要妥協的可選參數。