2013-09-26 21 views
3

所以說我有一個方法,我已經超載。一個函數返回uint,一個函數返回int。Wierd含糊不清的函數重載函數調用

static void test1(Func<uint> f) 
{ 
    //things 
} 
static void test1(Func<int> f) 
{ 
    // also things 
} 

現在我嘗試調用它像這樣:

test1(Random.FunctionThatReturnsUints); 

,但我在編譯的時候得到一個模棱兩可的呼叫錯誤:

Error 4 The call is ambiguous between the following methods or 
    properties: 'RNG_Comparison.Run.test1(System.Func<int>)' and 'RNG_Comparison.Run.test1 
(System.Func<uint>)' 

是什麼回事?是不是重載一個函數的重點,以便根據類型隱含地理解你指的是哪一個?我的意思是,如果我用一個返回BigInt的func來調用它,也許我可以看到編譯器的混淆,但是這個看起來非常乾淨。

有誰知道我爲什麼會出現這個錯誤?

+1

嘗試'test1(new Func (Random.FunctionThatReturnsUints))',看看是否會導致不同的編譯器錯誤。 – cdhowie

+0

@cdhowie,這將解決編譯器錯誤。 – Habib

+0

重載似乎沒問題,請發表更多代碼。 –

回答

1

在由Tim引post by Eric Lippert重要的是:

這裏的原則是確定方法組可兌換需要使用重載從方法組中選擇的方法,重載解析不考慮返回類型。

在你的代碼中有方法組轉換的行動,並導致問題。 建議的解決方案消除了這個問題。

+0

是的,我讀過那些有趣的東西。我明白爲什麼它是這樣的。謝謝 – NathanTempelman

1

Eric Lippert(C#團隊成員)稱爲this sort of thing「規範中最有趣的部分之一」,因此要完全回答「爲什麼編譯器會這樣做?」將是一個難題。可以這麼說,這是因爲C#規範允許這種情況發生。這是一個簡單的解決辦法:

test1(new Func<uint>(Random.FunctionThatReturnsUints)); 
+1

感謝您的大力支持!我注意到,我是C#語言設計和編譯器開發團隊的*前*成員。 –