在 C# 7.0 的时候提供更好用的模式匹配方法,支持通过 is 直接转换对应的类,但是如果是尝试转换可空的对象,那么将会提示无法编译,或转换失败



C# 7.0 的 is 转换是十分好用的功能,例如我写了一个 Foo 函数,支持将传入的参数转换

        private static void Foo<T>(object o)
{
if(o is T t)
{ }
}

此时会判断如果参数属于泛型 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 as bool?;

上面代码可以计算出一个为空的 bool? 但是在模式匹配里面是不进入判断

也就是在模式匹配里面其实不包含可空

这个问题有Blue小伙伴在 github 上的roslyn #20156 提出,他的问题翻译出来大概是这样

在进行可空的模式匹配的时候,将会编译出错,如果使用 Nullable<int> 将提示错误 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 B
{
public static int operator &(B left, B right) => 1;
public static int operator >(B left, B right) => 2;
public static int operator <(B left, B right) => 3; public static int operator &(bool left, B right) => 5;
public static int operator >(bool left, B right) => 6;
public static int operator <(bool left, B right) => 7;
} static void Main(string[] args)
{
object a = null;
B c = null;
Console.WriteLine(a is B & c);
Console.WriteLine(a is B > c);
Console.WriteLine(a is B < c);
}

请问上面代码输出多少

是将 a is B 的值作为 bool 转入计算还是将 a is B b 这个隐藏的 b 传入计算

请看 int? 竟然真的可以是 null

我搭建了自己的博客 https://blog.lindexi.com/ 欢迎大家访问,里面有很多新的博客。只有在我看到博客写成熟之后才会放在csdn或博客园,但是一旦发布了就不再更新

如果在博客看到有任何不懂的,欢迎交流,我搭建了 dotnet 职业技术学院 欢迎大家加入


本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系

C# 匹配可空变量的更多相关文章

  1. 2019-8-31-C#-匹配可空变量

    title author date CreateTime categories C# 匹配可空变量 lindexi 2019-08-31 16:55:58 +0800 2019-06-01 08:40 ...

  2. Javabean非空变量校验工具

    摘要 调研java Class getDeclaredFields() 与getFields()的区别,设计请求参数为Javabean时,基于反射机制校验其中非空变量的公共方法. java Class ...

  3. JS正则表达式一些基本使用、验证、匹配、正则匹配时一个变量

    js验证首位必须是字母 var str = "asfg"; /^[a-zA-Z].*/.test(str);//true是,false否 匹配所有空格 var str=" ...

  4. python初始化定义空变量-小记

    python初始化定义空变量 数值 digital_value = 0 字符串 str_value = "" 列表 list_value = [] 字典 ditc_value = ...

  5. boke练习: freemarker对空变量报错 (classic_compatible设置true,解决报空错误)

    我有一个变量: commentModel 默认只是为空, 在freemarker模板中使用<#if>判断是报错 <#if commentModel> ..... </#i ...

  6. 关于freemarker 空变量的接收以及类型转换 笔记

    通常接收一个变量是${siOrganid},如果并没有这个变量,是这么处理${siOrganid!},如果这个变量是某个类属性,是这么处理${interfsrv.siOrganid!},如果这个类也是 ...

  7. Bash:-:-定义空变量作为输出结合换行符\n和column输出

    RET="" declare -a HOST=() declare -a ALL_SVR=() declare -a FREESVR=() ;i<${#_ALL_AGENT_ ...

  8. 2019-11-19-C#-高级面试题

    title author date CreateTime categories C# 高级面试题 lindexi 2019-11-19 08:40:50 +0800 2018-11-12 11:18: ...

  9. C# 高级面试题

    很少会有人可以答对,如果你遇到一个来面试的人实在嚣张,就可以用本文的题去打击 本文内容就看着玩,请不要在严肃的面试中问题这样的题目 如果面试到一个人可以回答出下面的题目也不能证明他的技术很强,只能说明 ...

随机推荐

  1. linux 下安装编译配置 QT

    注: 1,自己 make qt-everywhere-opensource-src s时,在./configure前主动装好以下3个 sudo apt-get install libX11-dev l ...

  2. c# 日期函数

    DateTime dt = DateTime.Now;Label1.Text = dt.ToString();//2005-11-5 13:21:25Label2.Text = dt.ToFileTi ...

  3. iOS viewDidLayoutSubviews,viewdidload

    由于种种原因,最近才开始真正在新项目中使用autolayout,使用过程中虽说是比较顺畅,但是也遇到了一些麻烦,比如: 我使用的XIB默认是4寸屏幕,我再XIB中增加一个viewA,宽度为320,约束 ...

  4. acm一路走来的体验和想法

    2017年参加天梯赛 作为大一萌新去参加人生第一场正规的比赛,学校拿钱砸的.我呢,是十分激动的,是时候检验下自己的编程水平了,也有一丝慌张,怕给团队抹黑. 然后呢,晒一下自己成绩. 我本来觉得我和他们 ...

  5. hdu1403 后缀数组

    比较简单的应用. #include <stdio.h> #include <string.h> #define maxn 200002 int wa[maxn],wb[maxn ...

  6. some daily

    1. 一般div元素的background-color只覆盖到border,而其margin的颜色由外层元素的背景色决定. 2. 当设置了border-box以后,width=border+paddi ...

  7. 2019-8-31-dotnet-通过-WMI-获取设备厂商

    title author date CreateTime categories dotnet 通过 WMI 获取设备厂商 lindexi 2019-08-31 16:55:59 +0800 2019- ...

  8. oracle函数 SYS_CONTEXT(c1,c2)

    [功能]返回系统c1对应的c2的值.可以使用在SQL/PLSQL中,但不可以用在并行查询或者RAC环境中 [参数] c1,'USERENV' c2,参数表,详见示例 [返回]字符串 [示例] sele ...

  9. JS遍历数组

    for 如果用var会造成变量声明提前等问题for(var i = 1; i <= arr.length; i++){ console.log(arr[i - 1]);} for(let i = ...

  10. 前端开发之BOM和DOM(转载)

    BOM BOM:是指浏览器对象模型,它使JavaScript可以和浏览器进行交互. 1,navigator对象:浏览器对象,通过这个对象可以判定用户所使用的浏览器,包含了浏览器相关信息. naviga ...