zoukankan      html  css  js  c++  java
  • 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

    我搭建了自己的博客 https://blog.lindexi.com/ 欢迎大家访问,里面有很多新的博客。只有在我看到博客写成熟之后才会放在csdn或博客园,但是一旦发布了就不再更新

    如果在博客看到有任何不懂的,欢迎交流,我搭建了 dotnet 职业技术学院 欢迎大家加入

    知识共享许可协议
    本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系

  • 相关阅读:
    CentOS7配置Tomcat8开机自动启动
    StackExchange.Redis 异步超时解决方案
    同一个tomcat部署多个项目导致启动失败
    吐血记录微信小程序授权获取Unionid及linux下使用bouncycastle解密用户数据 遇到的坑
    CentOS7设置ssh服务以及端口修改
    linux CentOS7安装与配置nginx1.18.0 并设置开机启动
    C语言函数指针用法
    Javascript优点和缺点
    VIM 单词大小写转换
    python base64编码实现
  • 原文地址:https://www.cnblogs.com/lindexi/p/12086898.html
Copyright © 2011-2022 走看看