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# 7.0 的 is 轉換是十分好用的功能,例如我寫了乙個 foo 函式,支援將傳入的引數轉換
privatestatic
void
foo(object
o)
}
此時會判斷如果引數屬於泛型 t 那麼就轉換同時拿到物件 t 用於在判斷裡面用
但是有小夥伴說他傳入了乙個bool?
問我在什麼時候才能進入判斷
於是我就嘗試了下面的**
foo(null);
foo(true);
此時發現傳入null
的時候不會進入判斷,同時傳入 true 的時候可以進入判斷
也就是對於if (null is bool? b)
將會一直返回 false 同時這段**也編譯不通過,如果我將可空包裝一下會如何
objecto=null;
if (o
isnullable
b)
其實上面**也是編譯不通過的,會看到提示在模式匹配裡面使用可以為 null 的型別bool?
是非法的;請改用基礎型別bool
也就是模式匹配裡面對於空的判斷是認為小夥伴不能這樣寫
這個用法和 as 有一些不同
varb=null
asbool?;
上面**可以計算出乙個為空的bool?
但是在模式匹配裡面是不進入判斷
也就是在模式匹配裡面其實不包含可空
這個問題有blue小夥伴在 github 上的roslyn #20156 提出,他的問題翻譯出來大概是這樣
在進行可空的模式匹配的時候,將會編譯出錯,如果使用nullable
將提示錯誤cs8116
編譯失敗。使用int?
將會提示cs1003
cs1525
cs0103
編譯失敗
這裡需要了解一下運算對於 is 的做法,對於int?
其實你會看到格式化的時候是int ?
中間有乙個空格
objecto=null;
if (o
isbool ? b)
這是因為這句表示式編譯出來的是if ((o is bool) ? b)
這裡還缺少的就是後面的值
if (oisbool ? true : false)
這裡的o is bool?
作為的是運算子(o is bool) ? 如果o是bool 的時候的值: 如果不是的時候的值
所以提示的無法編譯就是找不到定義的變數和表示式為 false 的變數
那麼現在嘗試做一道題
classb
static
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...
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 2018 07 19 16 48 32 0800 c 現在寫了一些 想使用最少 來寫簡單的讀檔案,所以我就寫了這個文章 private ...