有小伙伴问我强转 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 提示用户传入的值不能强转传入的类型

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

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


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

C# 强转空会不会出现异常的更多相关文章

  1. 2019-10-31-C#-强转空会不会出现异常

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

  2. 程序中实现两个DataTable的Left Join效果(修改了,网上第二个DataTable为空,所处的异常)

    public static DataTable Join(DataTable First, DataTable Second, DataColumn[] FJC, DataColumn[] SJC) ...

  3. Kotlin——从无到有系列教程(5): 你该知道的Kotlin可空类型、空安全(null)、类型转换等特性

    在我们熟知的Java中,定义一个变量可以默认不赋值,因为Java的系统会给我们默认赋一个默认值,并且Java可定义一个赋值为null的变量,这样在使用这个变量的时候都会去显示判断该变量是否为null. ...

  4. Javabean非空变量校验工具

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

  5. 对前台传过来的实体是否为空 进行为空校验的N种方法

    首先定义一个注解,如下 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import j ...

  6. 使用MyBatis查询 返回类型为int,但是当查询结果为空NULL,报异常的解决方法

    使用MyBatis查询 返回类型为int,但是当查询结果为空NULL,会报异常. 例如: <select id="getPersonRecordId" parameterTy ...

  7. C# 判断字符串为空的4种方法及效率

    在程序开发过程中,少不了要处理字符串,并且常常要判断字符串是否为空,通常有哪些判断方法,以及不同方法的效率又怎么样? 在 C# 中,通常有三种判断字符串是否为空的方法,下面分别探讨. 1.str.Le ...

  8. springmvc 参数校验/aop失效/@PathVariable 参数为空

    添加依赖 <!-- 参数校验 --> <dependency> <groupId>org.hibernate.validator</groupId> & ...

  9. JAVA8新特性Optional,非空判断

    Optional java 的 NPE(Null Pointer Exception)所谓的空指针异常搞的头昏脑涨, 有大佬说过 "防止 NPE,是程序员的基本修养." 但是修养归 ...

随机推荐

  1. Kubernetes1.3新特性:rktnetes

    (一)  背景资料 对于Kubernetes来说,从架构设计上就是支持Docker和CoreOS rkt两种容器的,在1.2版本中,最低支持CoreOS rkt 0.13.0版本,这个rkt版本算是一 ...

  2. hdu2897 巴什博奕

    n%(q+p)==0,也就是说先手必胜; n%(q+p)<=p,先手必输; n%(q+p)==k if(k>p&&k<=q)先手必胜; if(k>p&& ...

  3. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第四章:Direct 3D初始化

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第四章:Direct 3D初始化 学习目标 对Direct 3D编程在 ...

  4. 机房收费系统之【只允许一个MDI窗体 错误:426】 标签: vb 2014-08-15 10:36 1149人阅读 评论(23)

    机房收费系统的主窗体是MDI窗体,为了在这个窗体上添加控件,所以我们在窗体上添加了picture控件,在MDI窗体中,子窗体实际上位于MDIClient里,即子窗体的父窗体就是MDIClient,而放 ...

  5. 从HelloWorld看Knative Serving代码实现

    摘要: Knative Serving以Kubernetes和Istio为基础,支持无服务器应用程序和函数的部署并提供服务.我们从部署一个HelloWorld示例入手来分析Knative Servin ...

  6. HDU-6703-array-2019CCPC选拔赛

    我TM真是一个弟弟... 题意: 给出一串1-N的数字 你每次可以把某个位置的值+1000000 或者找一个值,所有a[1]...a[r]序列的数都不能等于这个值,并且这个值>w 当时比赛觉得肯 ...

  7. sublime 插件安装packagecontrol

    https://packagecontrol.io/installation 第一步: Installation Simple The simplest method of installation ...

  8. react组件之间的参数传递

    1.父组件向子组件传递参数 class Child extends Component { componentDidMount(){ let name = this.props.default; co ...

  9. H3C 802.11协议的发展

  10. 最强 NLP 预训练模型库 PyTorch-Transformers 正式开源:支持 6 个预训练框架,27 个预训练模型

    先上开源地址: https://github.com/huggingface/pytorch-transformers#quick-tour 官网: https://huggingface.co/py ...