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