爲什麼不:參數方法簽名不匹配PARAMS委託
delegate void MyDelegate(params object[] parameters);
static void ShouldMatch() {}
MyDelegate compilerError = ShouldMatch;
編譯?它似乎應該匹配得很好。
爲什麼不:參數方法簽名不匹配PARAMS委託
delegate void MyDelegate(params object[] parameters);
static void ShouldMatch() {}
MyDelegate compilerError = ShouldMatch;
編譯?它似乎應該匹配得很好。
的委託,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();
params
是純粹的編譯時功能。
委託綁定忽略它。
您的委託必須完全匹配方法的參數,而忽略params
&可選參數。
該規範指出這明確,在6.6節:
Ø考慮的候選方法是隻有那些適用於他們的正常形式的方法(§7.5.3.1),而不是那些只適用於他們的擴張形成。
§7.5.3.1說:
對於包括參數數組,如果函數構件適用按上述規則的功能部件,它被說成是適用在其正常形式。如果包含參數數組的函數成員在其正常形式是不適用的,功能部件可以代替在其膨脹形式適用:
我已經被另一個誤導方法確實與委託匹配:'static void DoesMatch(object param)'。我認爲param是第一個對象,實際上它是一個包含所有對象的數組。 – Foxor