###### 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
```