2019-10-31-C#-强转空会不会出现异常
2024-10-08 02:15:29
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 提示用户传入的值不能强转传入的类型
最新文章
- 学习SQLAlchemy Core
- CopyOnWriteArrayList
- delphi XML 原来可以玩接口
- rr
- Servlet使用简介
- Python元祖
- Spring Cloud(十二):分布式链路跟踪 Sleuth 与 Zipkin【Finchley 版】
- Centos 7 搭建 你懂的
- VUE2 项目 引入 leaflet.draw全过程
- Win10系统总是提示";在商店中查找应用";的关闭方法
- webdriver设置浏览器全屏及设置浏览器窗口为特定大小的方法
- 目标检测(二)SSPnet--Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognotion
- 学习windows编程 day3 之窗口绘画一:点线绘制
- android应用私有存储文件的写入与读取-openFileInput 和 openFileOutput
- centos 配置subversion svn
- Linux多线程--使用信号量同步线程【转】
- python爬虫的教程
- Docker使用Dockerfile创建支持ssh服务自启动的容器镜像
- Tomcat Server
- TFS自定义开发中的反射应用
热门文章
- 深入浅出 Java Concurrency (22): 并发容器 part 7 可阻塞的BlockingQueue (2)[转]
- docker和宿主机之间复制文件
- 一次.NET项目反编译的实战经验(WinForm)
- iview 小问题笔记
- 抓取B站小视频
- 在多版本python的pip的安装与对应包的安装
- ubuntu 下安装 YouCompleteMe
- idea中使用本地jar包
- JAVA邀请码生成器
- 洛谷P2982 [USACO10FEB]慢下来Slowing down [2017年四月计划 树状数组01]