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