在 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++编程技术。






网友评论