NET问答: 为什么 null + true = string 呢?
咨詢(xún)區(qū)
Javed Akram:
請(qǐng)問(wèn) null + true 為什么是一個(gè) string 類(lèi)型的 True,代碼如下:
static?void?Main(string[]?args){string?b?=?null?+?true;Console.WriteLine(b);}誰(shuí)知道這背后的原理?
回答區(qū)
JaredPar:
這是因?yàn)槟阋坏┮肓?+ ,C# 操作符綁定規(guī)則就起作用了,編譯器會(huì)幫你選擇 + 的最佳重載方法,比如下面這個(gè):
string?operator?+(string?x,?object?y)顯而易見(jiàn),上面的 操作符重載 剛好就能容納你的 null + true,如果把代碼再補(bǔ)全一下就是 ((string)null) + true ,所以最后結(jié)果就是 True。
順便提一下,C# 語(yǔ)言規(guī)格書(shū)的第 7.7.4 節(jié)就聊到了這個(gè)決議。
點(diǎn)評(píng)區(qū)
其實(shí)這種問(wèn)題挺無(wú)聊的,現(xiàn)實(shí)開(kāi)發(fā)中應(yīng)該沒(méi)人會(huì)這么寫(xiě)吧,真有的話(huà),要么是炫技,要么是 StringBuilder 的簡(jiǎn)寫(xiě),我就簡(jiǎn)單聊聊吧,主要有兩點(diǎn)。
真的是 operator 嗎?
我翻遍了所有源碼都沒(méi)有找到所謂的 string operator +(string x, object y) ,最后不經(jīng)意間在 VS 的快捷提示中找到了。。。
真是強(qiáng)大的 VisualStudio,很顯然這是一個(gè)語(yǔ)法糖。
反編譯 DLL 看底層實(shí)現(xiàn)邏輯
先說(shuō)一下程序?qū)懺?.NETCore 3.1 上,我用 ILSpy 反編譯一下,如下圖:
看到?jīng)]有? 編譯器已經(jīng)幫你轉(zhuǎn)了一個(gè)更加簡(jiǎn)單粗暴的寫(xiě)法:string b = true.ToString() ?? ""; 這代碼意圖是不是更明顯 ?
什么,你說(shuō)我 ILSpy 有問(wèn)題,居然沒(méi)調(diào)用 String.Concat ?好吧,那我用 DnSpy 反編譯看看。。。
沒(méi)錯(cuò),就是一樣的寫(xiě)法,連 String.Concat 都省了,????????
總結(jié)
以上是生活随笔為你收集整理的NET问答: 为什么 null + true = string 呢?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 通过Dapr实现一个简单的基于.net的
- 下一篇: CentOS 7 安装 Greenplu