方法、實(shí)例構(gòu)造器、索引器和操作符由其簽名來鑒定:
params 修飾符(params modifier)指定的參數(shù)。params 修飾符(params modifier)指定的參數(shù)。簽名能使用類、結(jié)構(gòu)或接口的成員的重載機(jī)制:
雖然 out 和 ref 參數(shù)修飾符是構(gòu)成簽名的一部分,但不能僅通過 ref 和 out 修飾符來區(qū)分成員簽名。如果兩個(gè)成名聲明為相同簽名的類型(即使它們內(nèi)的方法的形參修飾符從 out 變?yōu)?ref),那么將出現(xiàn)一個(gè)「編譯時(shí)錯(cuò)誤」。為了簽名匹配的其他用途(比如隱藏 hidden 或重寫 overriding),ref 和 out 是構(gòu)成簽名的一部分,以便相互不匹配。(這個(gè)限制允許 C# 程序能輕易轉(zhuǎn)換為能運(yùn)行在公共語言基礎(chǔ)結(jié)構(gòu)(Common Language Infrastructure,CLI)上,CLI 并未提供方式去定義只通過 ref 和 out 進(jìn)行區(qū)別的方法)。
由于簽名的緣故,object 類型和 dynamic 類型被認(rèn)為是一樣的。因此不能僅通過 object 和 dynamic 來區(qū)別在單一類型中的成員聲明。
下例展示了一組重載的成員聲明及其簽名。
interface ITest
{
void F(); // F()
void F(int x); // F(int)
void F(ref int x); // F(ref int)
void F(out int x); // F(out int) 錯(cuò)誤
void F(int x, int y); // F(int, int)
int F(string s); // F(string)
int F(int x); // F(int) 錯(cuò)誤
void F(string[] a); // F(string[])
void F(params string[] a); // F(string[]) 錯(cuò)誤
}
注意,任何 ref 和 out 參數(shù)修飾符(第十章第 6.1 節(jié))都是簽名的一部分。因此,F(int) 和 F(ref int) 都是唯一的簽名。但是 F(ref int) 和 F(out int) 不能定義在同一個(gè)接口內(nèi),因?yàn)楹灻荒軆H從 ref 和 out 加以區(qū)分。同樣的,返回類型和 params 修飾符都不是簽名的一部分,所以不可能僅基于返回類型或是否包含 params 修飾符來區(qū)別重載,故而上面的方法聲明 F(int) 和 F(params string[]) 會(huì)引發(fā)一個(gè)「編譯時(shí)錯(cuò)誤」。