C 匹配可空變數

2022-01-14 15:13:52 字數 1952 閱讀 8680

在 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?將會提示cs1003cs1525cs0103編譯失敗

這裡需要了解一下運算對於 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,其結果為...