2013-10-23 30 views
1

爲什麼不:參數方法簽名不匹配PARAMS委託

delegate void MyDelegate(params object[] parameters); 
static void ShouldMatch() {} 
MyDelegate compilerError = ShouldMatch; 

編譯?它似乎應該匹配得很好。

+0

我已經被另一個誤導方法確實與委託匹配:'static void DoesMatch(object param)'。我認爲param是第一個對象,實際上它是一個包含所有對象的數組。 – Foxor

回答

1

的委託,MyDelegate定義了需要的對象的陣列的方法,但你的ShouldMatch方法沒有。假設您嘗試任何參數傳遞給你這樣的委託實例:

compilerError(someObject, someOtherObject); 

如果方法compilerError勢必不接受任何參數,你會想到會在這裏出現呢?

嘗試定義在該委託簽名相匹配的方式你的方法:

delegate void MyDelegate(params object[] parameters); 
static void ShouldMatch(params object[] parameters) {} 

MyDelegate noCompilerError = ShouldMatch; 

或者你可以嘗試它包裹在一個lambda表達式,像這樣:

delegate void MyDelegate(params object[] parameters); 
static void ShouldMatch() {} 

MyDelegate noCompilerError = (paramArray) => ShouldMatch(); 
0

params是純粹的編譯時功能。
委託綁定忽略它。

您的委託必須完全匹配方法的參數,而忽略params &可選參數。

該規範指出這明確,在6.6節:

Ø考慮的候選方法是隻有那些適用於他們的正常形式的方法(§7.5.3.1),而不是那些只適用於他們的擴張形成。

§7.5.3.1說:

對於包括參數數組,如果函數構件適用按上述規則的功能部件,它被說成是適用在其正常形式。如果包含參數數組的函數成員在其正常形式是不適用的,功能部件可以代替在其膨脹形式適用: