前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C# 强转空会不会出现异常

C# 强转空会不会出现异常

作者头像
林德熙
发布2019-09-13 19:39:00
8410
发布2019-09-13 19:39:00
举报
文章被收录于专栏:林德熙的博客

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

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

代码语言:javascript
复制
    class Program
    {
        static void Main(string[] args)
        {
            Program p = null;

            object obj = p;

            Foo foo = (Foo) obj;
        }
    }

    class Foo
    {

    }

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

代码语言:javascript
复制
    enum NerefiweakawBejairlalhu
    {
        
    }

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

代码语言:javascript
复制
System.NullReferenceException:“Object reference not set to an instance of an object.”

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

代码语言:javascript
复制
    class Foo<T>
    {
        public void Cast(object obj)
        {
            var foo = (T) obj;
        }
    }

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

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

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

代码语言:javascript
复制
    class Foo<T> where T : class

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

代码语言:javascript
复制
class Foo<T> where T : struct

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

代码语言:javascript
复制
    class Foo<T> where T : struct
    {
        public void Cast(object obj)
        {
            if (obj is T t)
            {
                var foo = t;
            }
        }
    }

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


本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档