美文网首页C语言程序园
C# 匹配可空变量

C# 匹配可空变量

作者: 编程小世界 | 来源:发表于2019-06-25 19:20 被阅读5次

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

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

privatestaticvoidFoo<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 有一些不同

varb=nullasbool?;

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

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

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

在进行可空的模式匹配的时候,将会编译出错,如果使用Nullable<int>将提示错误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 的变量

那么现在尝试做一道题

classB{publicstaticint operator&(B left,B right)=>1;publicstaticint operator>(B left,B right)=>2;publicstaticint operator<(B left,B right)=>3;publicstaticint operator&(bool left,B right)=>5;publicstaticint operator>(bool left,B right)=>6;publicstaticint operator<(bool left,B right)=>7;}staticvoidMain(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 传入计算

看我主页简介免费C++学习资源,视频教程、职业规划、面试详解、学习路线、开发工具

每晚8点直播讲解C++编程技术。

相关文章

  • C# 匹配可空变量

    在 C# 7.0 的时候提供更好用的模式匹配方法,支持通过 is 直接转换对应的类,但是如果是尝试转换可空的对象,...

  • C#魔将-lesson_03-可空类型

    可空类型(Nullable) C# 提供了一个特殊的数据类型,nullable 类型(可空类型),可空类型可以表示...

  • C# 第二节

    C# 可空类型(Nullable) C# 单问号 ? 与 双问号 ?? ? :单问号用于对 int,double,...

  • Kotlin学习笔记-空类型、空安全、非空断言、类型转换等特性总

    一、可空类型、空安全 1.1、定义一个可空类型的变量 定义一个可空类型的变量的格式为:修饰符 变量名 : 类型? ...

  • C# 可空类型

    1 单问号 '?' 与双问号 '??' 1.1 单问号 单问号用于对 int、double、bool 等无法直接赋...

  • Swfit可空(Optional)类型基础

    可空类型,对于熟悉C#的同学一定不会陌生。在C#里面值类型都是不能为空的,比如int类型默认为0,bool默认为f...

  • Kotlin学习(三)——可空类型、空安全和Elvis 操作符

    1.1 定义一个可空类型的变量 例如: 输出: 分析:要定义一个可空类型的变量时,即在定义变量的类型后面加上?符号...

  • 1.shell变量替换

    1.${变量#匹配规则} 从头开始,最短匹配 2.${变量##匹配规则} 从头开始,最长匹配 3.${变量%匹...

  • 可空类型

    可空类型: 类型转换的时候结果是可空类型,所以需要let 这种临时变量来获取。 隐式展开可空类型: 可空链式调用:...

  • C#语言入门详解006

    006 C#类型、变量与对象详解 目录 *什么是类型*类型在C#语言中的作用*C#语言的类型系统*变量、对象与内存...

网友评论

    本文标题:C# 匹配可空变量

    本文链接:https://www.haomeiwen.com/subject/mlnxcctx.html