C#关于参数为null(空值)的方法调用,重载顺序选择彻底研究
其實(shí)這是一個(gè)很老的問(wèn)題了,很久以前就在園子里看到有人對(duì)此迷惑,當(dāng)時(shí)也沒(méi)太在意,覺(jué)得哪會(huì)有人那么寫代碼。直到最近丁學(xué)君的這篇文章:“關(guān)于參數(shù)為可空值類型的多個(gè)重載的優(yōu)先級(jí)”才讓我對(duì)這個(gè)問(wèn)題重新有了興趣。并且做出了一個(gè)大膽的猜想,現(xiàn)在這個(gè)猜想已經(jīng)被我驗(yàn)證了。
?
所有具備單向隱式類型轉(zhuǎn)換或者存在繼承關(guān)系的類型的方法重載,當(dāng)使用null值調(diào)用時(shí),將會(huì)使用隱式類型轉(zhuǎn)換的方向來(lái)確定調(diào)用哪個(gè)方法。
?
簡(jiǎn)而言之,假設(shè)TypeA和TypeB之間存在一個(gè)隱式類型轉(zhuǎn)換或者繼承關(guān)系,方向是TypeA對(duì)象可以隱式轉(zhuǎn)換為TypeB(TypeA存在一個(gè)到TypeB的隱式類型轉(zhuǎn)換或者TypeA派生于TypeB)。
又有兩個(gè)方法的重載如下:
public void MyMethod( TypeA obj ){ … }//重載A
public void MyMethod( TypeB obj ){ … }//重載B
?
那么MyMethod( null )一定會(huì)選擇重載A。
?
但是這還沒(méi)完,我仔細(xì)測(cè)定了各種情況的調(diào)用情況,并和裝配腦袋一起分析整理了一下,還有如下結(jié)論:
?
1、對(duì)于Nullable<T>類型而言,T所擁有的運(yùn)算符(包括隱式類型轉(zhuǎn)換運(yùn)算符)都會(huì)被投射到T?類型。比如說(shuō),int有一個(gè)隱式類型轉(zhuǎn)換到long,那么int?也就會(huì)自動(dòng)存在一個(gè)隱式類型轉(zhuǎn)換到long?。同樣的,TypeA?也有一個(gè)隱式類型轉(zhuǎn)換到TypeB?(如果TypeA和TypeB是值類型)。這就解釋了丁學(xué)文章中所說(shuō)的問(wèn)題。
?
2、如果兩個(gè)類型之間存在雙向的隱式類型轉(zhuǎn)換,即TypeA可以隱式類型轉(zhuǎn)換為TypeB,而TypeB也可以隱式類型轉(zhuǎn)換為TypeA,這種情況下,使用null值調(diào)用會(huì)是一個(gè)編譯錯(cuò)誤。推廣開(kāi)來(lái),如果多個(gè)類型之間存在一個(gè)閉環(huán)的隱式類型轉(zhuǎn)換,比如說(shuō)TypeA->TypeB,TypeB->TypeC,TypeC->TypeA,那么如果這三個(gè)類型的重載都存在的話,使用null值調(diào)用同樣的編譯錯(cuò)誤,但是如果只有兩個(gè)類型的重載存在(即方法重載的參數(shù)類型不存在閉環(huán))那么也不會(huì)有錯(cuò)誤。
?
3、數(shù)組的協(xié)變也會(huì)被看作是一個(gè)隱式類型轉(zhuǎn)換,比如說(shuō)TypeA派生于TypeB,則TypeA[]存在一個(gè)到TypeB[]的隱式轉(zhuǎn)換,這個(gè)被稱之為數(shù)組的協(xié)變。那么這個(gè)隱式轉(zhuǎn)換也會(huì)被這個(gè)規(guī)則采信,即如果兩個(gè)方法的參數(shù)是TypeA[]和TypeB[]的話,采用null值調(diào)用會(huì)選擇TypeA[]的重載。
?
4、VB中也采用類似的規(guī)則,這一點(diǎn)有待裝配腦袋的確認(rèn)。
總結(jié)
以上是生活随笔為你收集整理的C#关于参数为null(空值)的方法调用,重载顺序选择彻底研究的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 我刚上路
- 下一篇: 关于CSS属性display:none和