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# 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 传入计算
最新文章
- [WPF系列]-使用Binding来同步不同控件的Dependency property
- Eclipse统计代码行数
- IntelliJ IDEA 将 Maven 构建的 Java 项目打包
- Linux 信号详解二(信号分类,信号处理,kill)
- [置顶] TortoiseGit和msysGit安装及使用笔记(windows下使用上传数据到GitHub)
- 关于使用Transaction对于非数据库事务的操作
- ArcGIS Runtime for Android开发教程V2.0(1)基本概念
- mount命令详解
- 如何使用git创建项目,创建分支
- ERROR 1062 (23000): Duplicate entry &#39;1-1&#39; for key &#39;PRIMARY&#39;
- QT国际化
- 第二课:Hadoop集群环境配置
- PAT 1116 Come on! Let&#39;s C
- C# MD5 加密
- China Operating System 电脑操作系统 2016全球互联网排名
- CRM UI 打印PDF
- HTML5 实现获取 gzip 压缩数据,并进行解压,同时解决汉字乱码,相关 pako.js
- QQ登录整合/oauth2.0认证-04-调整到QQ互联进行QQ登录
- RTCM32转码至RTCM23,再次测试,一些收获
- caffe可视化
热门文章
- 【风马一族_php】NO2_php基础知识
- Python学习之路9☞面向对象的程序设计
- python 函数定义与调用时,不定长参数的传入
- LinkedHashMap.get(";key";)
- Django框架登录验证及产生随机验证码的实例
- 开发者必知的8款App快速开发工具开发者必知的8款App快速开发工具
- Python基础:11变量作用域和闭包
- 如何解决iOS内存错误
- 11-2 css盒模型和浮动以及矢量图用法
- SDUT-2132_数据结构实验之栈与队列二:一般算术表达式转换成后缀式