1. 程式人生 > >一個從沒見過的C# ?.語法

一個從沒見過的C# ?.語法

      上週下了NanUI的原始碼跟示例程式碼,這一段時間一直在研究其原始碼。在其中發現了一個從沒見過,而又被這個開源專案很多地方使用的語法,?.語法,如下2圖所示,百度搜索只找到只有描述?、??和? :語法的,而沒看到?.功能描述。

1

2

我對?.語法的總結

語法結構 表示式 ? .[屬性|方法]
功能推測 表示式為空時,返回空,或者不呼叫任何方法,否則返回後面指定的屬性或者呼叫後面的方法。
返回值 根據屬性|方法的設定確定,見以下注意點的描述
注意: 1、表示式(所指並非整個語法結構)返回結果的資料型別必須是可空資料型別,如果是諸如bool、int、long等值型別資料型別,是無法使用?.語法的;
  2、點號後面可以呼叫的屬性和方法屬於前面表示式的。例如第1個例子中,Invoke()方法是action變數的方法。你不能呼叫其它變數的屬性方法;
  3、當點號後面的是屬性時,整個語法結構必定有返回值,如圖2所示。表示式為空時,返回空,否則返回後面指定的屬性。
  4、當點號後面的是方法時,整個語法結構是否有返回值,取決於該方法是否有返回值。如上面第1張圖,由於Invoke()方法返回值型別為void,所以最終沒有返回值。

有趣的事情:

      以上說到點號後面是屬性或者是方法,且方法有返回值時,最終整個語法有返回值,另外我們又說表示式應該是可空型別。假設點號後面呼叫的屬性或方法返回值型別是非可空型別的,也就是說諸如bool、int、long等值型別資料型別,那麼最終的整個語法結構的返回值型別會是什麼了?

      1、首先我多加了一個擴充套件Action的函式,函式返回值為int非可空型別,程式碼如下所示:

public static int GetIntValue(this Action action)
{
    
return 20; }

      2、然後我們寫一行如下所示的程式碼,此時我們會發現VS IDE提示語法錯誤,如下圖所示:

int v= action?.GetIntValue();

      3

      3、然後我們將程式碼資料型別宣告int更換為var,在監視視窗中新增變數v的監視項,打上斷點,啟動除錯,會看到如下所示的結果。

      4

      4、總結下,如果點號後面呼叫的屬性或者方法的返回值型別為值型別資料型別時,整個語法結構的返回值的資料型別會被VS自動轉換為對應的可空型別