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 传入计算

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

2019-8-31-C#-匹配可空变量的更多相关文章

  1. C# 匹配可空变量

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

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

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

  3. Javabean非空变量校验工具

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

  4. “全栈2019”Java第十二章:变量

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  5. agentzh 的 Nginx 教程(版本 2019.07.31)

    agentzh 的 Nginx 教程(版本 2019.07.31) agentzh 的 Nginx 教程(版本 2019.07.31) https://openresty.org/download/a ...

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

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

  7. 第31课 std::atomic原子变量

    一. std::atomic_flag和std::atomic (一)std::atomic_flag 1. std::atomic_flag是一个bool类型的原子变量,它有两个状态set和clea ...

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

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

  9. 2020届京东秋招正式批一面记录-Java开发-2019.08.31

    京东一面总结 总共时间持续时间约40分钟 1.你用过集合类里面哪些是线程安全的,哪些是线程不安全的?分别举两个例子? 线程安全:HashTable以及ConcurrentHashMap 非线程安全:A ...

随机推荐

  1. ListView组件中 onEndReached 方法在滚动到距离列表最底部一半时执行

    初次使用ListView,在写列表滚动到最底部自动加载使用到方法onEndReached, 发现: ListView组件中 onEndReached 方法在滚动到距离列表最底部一半时执行, 于是翻看文 ...

  2. Python发送邮件1(带附件的)

    普通的发邮件(不使用类)

  3. [iOS开发系列]根据Debug和Release状态的变化来屏蔽日志输出

    今天在这里分享一个很实用的小技巧. 我们平时在开发应用的时候,经常会用到NSLog来调试我们的程序,而随着项目越来越大,这些用于调试的日志输出就会变得很难管理. 我们在发布正式版的时候一定要屏蔽掉所有 ...

  4. 【NS2】Ubuntu 12.04 LTS 中文输入法的安装(转载)

    本文是笔者使用 Ubuntu 操作系统写的第一篇文章!参考了红黑联盟的这篇文章:Ubuntu 12.04中文输入法的安装 安装 Ubuntu 12.04 着实费力一番功夫,老是在用 Ubuntu 来引 ...

  5. 使用jQuery的 autocomplete 实现输入框 自动提示补全

    参考网址: https://www.cnblogs.com/jinzhiming/p/6768402.html 插件下载地址: 链接:https://pan.baidu.com/s/1SpP3hixZ ...

  6. Python基础:24with语句

    一:with语句 在Python 2.6 中正式引入的with语句,是用来简化代码的.这与用try-except 和try-finally所想达到的目的前后呼应.try-except 和try-fin ...

  7. @codeforces - 117C@ Cycle

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个竞赛图(有向完全图),请找出里面的某个三元环,或者判断不 ...

  8. HZOJ visit

    对于前30%的数据,可以考虑dp,f[i][j][k]表示时间为i,在i,j位置的方案数,枚举转移即可.要注意的是可以走到矩阵外. 对于另外30%数据,考虑推一下式子,设向右走y步,左z,上s,下x. ...

  9. MySQL数据库优化(五)——MySQL查询优化

    http://blog.csdn.net/daybreak1209/article/details/51638187 一.mysql查询类型(默认查询出所有数据列)1.内连接       默认多表关联 ...

  10. uni-app中使用Echarts绘画图表

    enmnm...一般会使用npm下载echarts这个包,但是不知道是我自己的配置问题还是别的原因,一直出不来图线, 于是,把Hello uni-app模板里的那个组件抱过来,然后,成了! 首先, 1 ...