zoukankan      html  css  js  c++  java
  • 2019-10-31-C#-强转空会不会出现异常

    title author date CreateTime categories
    C# 强转空会不会出现异常
    lindexi
    2019-10-31 8:53:6 +0800
    2019-9-10 11:41:7 +0800
    C#

    有小伙伴问我强转 null 会不会出现异常,我告诉他,如果是引用类型那么不会,如果是值类型,那么会出现空异常

    如果是引用类型,只要是空类型,是支持随意转换,如下面代码,这是可以运行

        class Program
        {
            static void Main(string[] args)
            {
                Program p = null;
    
                object obj = p;
    
                Foo foo = (Foo) obj;
            }
        }
    
        class Foo
        {
    
        }

    如果使用值类型转换,那么将会出现空异常,例如我定义一个枚举

        enum NerefiweakawBejairlalhu
        {
            
        }

    下面代码运行的时候会提示

    System.NullReferenceException:“Object reference not set to an instance of an object.”

    也就是如果你看到了泛型的转换,请确定泛型不会传入值类型

        class Foo<T>
        {
            public void Cast(object obj)
            {
                var foo = (T) obj;
            }
        }

    上面代码如果用户传入了值类型,例如 枚举 作为泛型,那么调用 Cast 传入空的值,将会提示对象为空,所以在使用泛型转换的时候,可能强转为空

    如果此时将强转换为 as 关键字,将会提示 由于类型参数“T”既没有类类型约束也没有“class”约束,因此不能与“as”运算符一起使用

    如果要给泛型约束只能给引用类型用,那么请加上 class 条件

        class Foo<T> where T : class

    如果需要给值类型用,请使用下面代码

    class Foo<T> where T : struct

    如果看到了一个 obj 强转一个值类型,那么在 obj 为空的时候出现异常,推荐的方法是通过 is 关键字,在 C# 7.0 的时候可以使用 is 匹配,请看下面代码

        class Foo<T> where T : struct
        {
            public void Cast(object obj)
            {
                if (obj is T t)
                {
                    var foo = t;
                }
            }
        }

    当前,请记得加上 else 提示用户传入的值不能强转传入的类型

  • 相关阅读:
    Java变量相关
    centos 7安装Docker
    字符串匹配的KMP算法
    [转]关于”算法工程师/机器学习工程师”的笔试和面试总结
    希腊字母与拉丁字母的对应
    决策树和基于决策树的集成方法(DT,RF,GBDT,XGB)复习总结
    机器学习总结
    bat批处理的注释语句
    Python中使用pickle持久化对象
    怎样用通俗的语言解释REST,以及RESTful?
  • 原文地址:https://www.cnblogs.com/lindexi/p/12085955.html
Copyright © 2011-2022 走看看