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 传入计算
2019-8-31-C#-匹配可空变量的更多相关文章
- C# 匹配可空变量
在 C# 7.0 的时候提供更好用的模式匹配方法,支持通过 is 直接转换对应的类,但是如果是尝试转换可空的对象,那么将会提示无法编译,或转换失败 在 C# 7.0 的 is 转换是十分好用的功能,例 ...
- JS正则表达式一些基本使用、验证、匹配、正则匹配时一个变量
js验证首位必须是字母 var str = "asfg"; /^[a-zA-Z].*/.test(str);//true是,false否 匹配所有空格 var str=" ...
- Javabean非空变量校验工具
摘要 调研java Class getDeclaredFields() 与getFields()的区别,设计请求参数为Javabean时,基于反射机制校验其中非空变量的公共方法. java Class ...
- “全栈2019”Java第十二章:变量
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- agentzh 的 Nginx 教程(版本 2019.07.31)
agentzh 的 Nginx 教程(版本 2019.07.31) agentzh 的 Nginx 教程(版本 2019.07.31) https://openresty.org/download/a ...
- python初始化定义空变量-小记
python初始化定义空变量 数值 digital_value = 0 字符串 str_value = "" 列表 list_value = [] 字典 ditc_value = ...
- 第31课 std::atomic原子变量
一. std::atomic_flag和std::atomic (一)std::atomic_flag 1. std::atomic_flag是一个bool类型的原子变量,它有两个状态set和clea ...
- boke练习: freemarker对空变量报错 (classic_compatible设置true,解决报空错误)
我有一个变量: commentModel 默认只是为空, 在freemarker模板中使用<#if>判断是报错 <#if commentModel> ..... </#i ...
- 2020届京东秋招正式批一面记录-Java开发-2019.08.31
京东一面总结 总共时间持续时间约40分钟 1.你用过集合类里面哪些是线程安全的,哪些是线程不安全的?分别举两个例子? 线程安全:HashTable以及ConcurrentHashMap 非线程安全:A ...
随机推荐
- IIS 设置 FTP 服务器 添加多个账户
我们有很多童鞋经常开不动IIS自带的FTP如何创建,就算创建了也不会实现多用户,下面我来分享一下我的经验吧: 使用 IIS 设置 FTP 服务器 依次单击“开始”按钮.“控制面板”和“添加或删除程序” ...
- PHP Laravel系列之环境搭建( VirtualBox+Vagrant+Homestead+系列网址)
搭建环境从来都是阻挡一门新技能的最致命的硬伤,为了这个环境,我又是花费了半天的时间,各种问题层出不穷,下面基于网上的一些教程(我看到的都多少有些问题) 开始的时候是在实验楼这个平台上开始学习的,不过 ...
- 小爬爬1.requests基础操作
1.requests安装的问题 (1)如果requests没有安装,我们需要先安装这个模块,在cmd安装不了,我们可以在下面的位置,打开的窗体安装requests模块 pip install requ ...
- Java练习 SDUT-2670_3-1 Point类的构造函数
3-1 Point类的构造函数 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 通过本题目的练习可以掌握类的构造函数的定 ...
- bzoj4152 The Captain
Description 给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1号点走到n号点的最小费用. Input 第一行包含一个正整数n(2 ...
- centos安装php7.18注意
报错–php53-common conflicts with php-common //解决 yum -y install php* --skip-broken 第一步:安装源 yum install ...
- 【Leetcode链表】环形链表 II(142)
题目 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 pos ...
- UVa 623 大整数乘法
UVa 623 计算N! n上限为1000自然不能直接算.所以可以开一个数组f[],f[]每一位存N!结果的6位.如果按进制来理解,就是10^6进制: 例如 11!=39916800=11*10!=1 ...
- sum(),max(),avg(),RATIO_TO_REPORT()--分组统计
select id,area, sum(1) over() as 总记录数, sum(1) over(partition by id) as 分组记录数, sum(score) over() as 总 ...
- 2019-1-29-Moq基础-判断方法被执行
title author date CreateTime categories Moq基础 判断方法被执行 lindexi 2019-01-29 16:29:57 +0800 2019-01-17 1 ...