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