###### tags: `學習記錄` `C#` # C# 中型別後面的問號是什麼 在看別人的程式碼中注意到有些型別後面會加上問號? ```csharp= double? pi = 3.14; char? letter = 'a'; int? m = m2; bool? flag = null; // An array of a nullable value type: int?[] arr = new int?[10]; ``` 原來是加上問號後可為 null 之實值型別的預設值代表 null,也就是其屬性 false 會傳回的實例```Nullable<T>.HasValue```,否則任何可為 null 的實值型別都是泛型 ```System.Nullable<T>``` 結構的實例。 [微軟文件:可為 null 的實數值型別](https://docs.microsoft.com/zh-tw/dotnet/csharp/language-reference/builtin-types/nullable-value-types) :::warning 如果沒有加?就賦值 null 會編譯失敗,因為不得將該型別賦值為 null ::: 從 c # 7.0 開始,可以使用運算子搭配型別模式來檢查可為 null 實值型 null 別的實例,並取出基礎型別的值: ```csharp= int? a = 42; if (a is int valueOfA) { Console.WriteLine($"a is {valueOfA}"); } else { Console.WriteLine("a does not have a value"); } // Output: // a is 42 ``` 也可使用 HasValue 屬性來測試變數是否包含值 或直接判斷是否為 null ```csharp= int? b = 10; b.HasValue; b != null; ``` ## 兩個 ?? 的情況 從可為 null 的實值型別轉換為基礎類型 可指定要指派的值來取代 null ```csharp= num3 = num1 ?? 5.34; Console.WriteLine(" Value of num3: {0}", num3); // Value of num3: 5.34 num3 = num2 ?? 5.34; Console.WriteLine(" Value of num3: {0}", num3); // Value of num3: 3.14157 ```