有BUG!!!慎用default文本
生活随笔
收集整理的這篇文章主要介紹了
有BUG!!!慎用default文本
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前言
下面這段代碼,你能發現什么問題嗎?
public?static?int??Test1(string?str) {return?str?switch{"A"?=>?1,"B"?=>?2,"C"?=>?3,_?=>?default,}; } public?static?int??Test2(string?str) {switch?(str){case?"A":return?1;case?"B":return?2;case?"C":return?3;default:return?default;} }好像沒什么問題,執行下列代碼:
Console.WriteLine("Test1:"?+?Test1("My?IO")); Console.WriteLine("Test2:"?+?Test2("My?IO"));現在你看到問題了吧!Test1返回了int而不是int?的默認值!
什么是default文本
從 C# 7.1 開始,當編譯器可以推斷表達式類型時,可以使用 default 文本生成類型的默認值。default 文本表達式生成與 default(T)?表達式(其中,T 是推斷的類型)相同的值。可以在以下任一情況下使用 default 文本:
對變量進行賦值或初始化時。
在聲明可選方法參數的默認值時。
在方法調用中提供參數值時。
在 return 語句中或作為表達式主體成員中的表達式時。
bug
問題就在于,編譯器推斷錯了類型。
反編譯生成的代碼:
可以看到,編譯器把switch表達式中的default轉換成0,而把switch語句中的default轉換成null。
結論
解決方法也簡單,換成default(int?)或者直接用null。
總之,慎用default,你不知道編譯器都做了啥!
總結
以上是生活随笔為你收集整理的有BUG!!!慎用default文本的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Blazor 组件库开发指南
- 下一篇: 使用 baget 搭建 nuget 私有