2012-02-03 69 views
0

考慮以下兩個功能:是否有可能限制參數不是代表?

'Overload 1 
<Extension()> 
Function ComputeReturnValue(Of TSource, TResult)(ByVal source As TSource, ByVal IfTrueFunc As 
System.Func(Of TSource, TResult), ByVal IfFalseFunc As System.Func(Of TSource, TResult)) As TResult 

    Return If([some test is true], IfTrueFunc(source), IfFalseFunc(source)) 
End Function 

'Overload 2 
<Extension()> 
Function ComputeReturnValue(Of TSource, TResult)(ByVal source As TSource, ByVal IfTrueValue As 
TResult, ByVal IfFalseFunc As TResult) As TResult 

    Return If([some test is true], IfTrueValue, IfFalseValue) 
End Function 

在詞語,ComputeReturnValue執行一些測試(未重要現在),並返回根據結果不同的值。我有兩個版本,因爲有時我想返回調用函數的結果來形成結果,有時我只想返回固定值。

的問題是,當我(嘗試)調用超載1,而不是調用正確的函數,編譯器調用超載2,並返回Func(Of TSource, TResult)對象,而不是調用作用的結果。我發現這是因爲重載2不限制類型,所以Func是這個例程的有效參數,我願意相信在這種情況下編譯器會正確選擇重載。

我的問題是:什麼是實現這個解決歧義,這樣我可以通過值或引用類型,並得到過載2,但傳遞函數,並得到過載1的正確方法?我可以通過某種方式限制這些類型以實現此目的嗎?或者我應該給他們起個不同的名字並避免這個問題?

(我知道我可以只保留函數功能的版本,並在瑣碎Function() IfTrueValue傳遞時,我想返回一個值,但我試圖讓這句法含糖越好。)

回答

1

肯定給他們不同的名字。每當你對重載鬥爭,認爲誰在追你來的 - 而且很可能是熟悉代碼。對你而言,任何棘手的事情對他們來說都會變得更加棘手,而賦予方法不同的描述性名稱會讓每個人的生活更美好。

+0

我相信你是對的。我會給他們不同的名字。謝謝。 – 2012-02-03 16:45:34

相關問題