試煉13 - 語法糖的坑踩過了嗎

2022 鐵人賽文 搬回點部落

開始試煉

就用Demo 這篇FB 當做範例好了

程式如下

void Main()
{
    int? a = 1;
    int? b = 1;
    var c = a??0 - b??0;
    c.Dump("c");
}

先用想的
首先 a??0 是指當a是null時,就替代成0
然而 a 跟 b 都不是null 所以都不會替換
想像中
var c = 1-1;
所以c是零 對吧
實際上跑一次
 

居然跟我想的不一樣答案c是1
來分析看看原因
在看到
var c = a??0 - b??0;
當a是1時 ??0 - b??0; 基本上就不會執行了
所以c就會是1
程式碼就等於
var c = a;

那在給一個問題
a是null的話呢 注意??後本來是0 我改成5 跟 30 了喔

void Main()
{
    int? a = null;
    int? b = 1;
    var c = a??5 - b??30;
    c.Dump("c");
}

先用想的
a??5 這次a是null 所以會被替換成5
問題來了 程式會執行後面的 - b??30;嗎?
如果會執行 就會變成 var c = 5-1;
不會執行 var c = 5;
實際跑看看
 


答案是4表示是會執行- b??30;

那a跟b是null的話呢

void Main()
{
    int? a = null;
    int? b = null;
    var c = a ?? 5 - b ?? 30;
    c.Dump("c");
}

讓你想想答案是
?
?
?
?
?
 


跟你想的一樣嗎 來看看C#到底是怎樣看待這段code吧
再次出現 程式是按照我寫的跑 不是按照我想的跑
(語法糖夠甜吧)
 

最後回到最初的題目要怎樣寫才是按照我們本來想的呢
 

結束試煉

程式要跑過一次看到結果跟想的一樣才是真的
請不要修改過後測都不測就上正式機阿

PS. LINQPad 6 開始才有IL+Native的功能

如果內容有誤請多鞭策謝謝