在 c# 7.0 的時候提供更好用的模式匹配方法,支援通過 is 直接轉換對應的類,但是如果是嘗試轉換可空的物件,那麼將會提示無法編譯,或轉換失敗
在 c# 7.0 的 is 轉換是十分好用的功能,例如我寫了乙個 foo 函式,支援將傳入的引數轉換
private
static
void
foo<
t>
(object o)
}
此時會判斷如果引數屬於泛型 t 那麼就轉換同時拿到物件 t 用於在判斷裡面用
但是有小夥伴說他傳入了乙個bool?
問我在什麼時候才能進入判斷
於是我就嘗試了下面的**
foo
<
bool?>
(null);
foo<
bool?>
(true
);
此時發現傳入null
的時候不會進入判斷,同時傳入 true 的時候可以進入判斷
也就是對於if (null is bool? b)
將會一直返回 false 同時這段**也編譯不通過,如果我將可空包裝一下會如何
object o =
null;if
(o is nullable<
bool
> b)
其實上面**也是編譯不通過的,會看到提示在模式匹配裡面使用可以為 null 的型別bool?
是非法的;請改用基礎型別bool
也就是模式匹配裡面對於空的判斷是認為小夥伴不能這樣寫
這個用法和 as 有一些不同
var b =
null
asbool
?;
上面**可以計算出乙個為空的bool?
但是在模式匹配裡面是不進入判斷
也就是在模式匹配裡面其實不包含可空
這個問題有blue小夥伴在 github 上的roslyn #20156 提出,他的問題翻譯出來大概是這樣
在進行可空的模式匹配的時候,將會編譯出錯,如果使用nullable
將提示錯誤cs8116
編譯失敗。使用int?
將會提示cs1003
cs1525
cs0103
編譯失敗
這裡需要了解一下運算對於 is 的做法,對於int?
其實你會看到格式化的時候是int ?
中間有乙個空格
object o =
null;if
(o is
bool
? b)
這是因為這句表示式編譯出來的是if ((o is bool) ? b)
這裡還缺少的就是後面的值
if
(o is
bool
?true
:false
)
這裡的o is bool?
作為的是運算子(o is bool) ? 如果o是bool 的時候的值: 如果不是的時候的值
所以提示的無法編譯就是找不到定義的變數和表示式為 false 的變數
那麼現在嘗試做一道題
class
bstatic
void
main
(string
args)
請問上面**輸出多少
是將a is b
的值作為 bool 轉入計算還是將a is b b
這個隱藏的 b 傳入計算
請看 int? 竟然真的可以是 null
C 匹配可空變數
在 c 7.0 的時候提供更好用的模式匹配方法,支援通過 is 直接轉換對應的類,但是如果是嘗試轉換可空的物件,那麼將會提示無法編譯,或轉換失敗 在 c 7.0 的 is 轉換是十分好用的功能,例如我寫了乙個 foo 函式,支援將傳入的引數轉換 private static void foo t o...
2019 8 31 C 匹配可空變數
title author date createtime categories c 匹配可空變數 lindexi 2019 08 31 16 55 58 0800 2019 06 01 08 40 11 0800 c 在 c 7.0 的時候提供更好用的模式匹配方法,支援通過 is 直接轉換對應的類,...
C 可空型別
可空型別只能用於值型別,不能用於引用型別,引用型別本身支援null值。如果直接把null賦值給int型別,會出現乙個錯誤 無法將 null 轉換成 int 因為它是一種值型別 賦值時應該使用 int?a null 可空型別與一元或二元運算子一起使用是,如果乙個運算元或兩個運算元都是null,其結果為...