您当前的位置:首页 > 文章 > 错误分析:System.InvalidCastException: Specified cast is not vali

错误分析:System.InvalidCastException: Specified cast is not valid.

作者:阿文 时间:2024-07-12 阅读数:186 人阅读

一、System.InvalidCastException: Specified cast is not valid.

记录一个由C# 装箱和拆箱导致的转换异常报错。
看例子:
long a = 1;
object b = a;
int c = (int)b;
以上代码将b转换成int型时将会发生异常报错,System.InvalidCastException: Specified cast is not valid.
让我们分析下为什么会报错?首先说说装箱和拆箱的概念。

1、什么是装箱和拆箱?

装箱 和拆箱 是C#类型系统的核心概念,通过装箱和拆箱操作,可以轻松的实现值类型与引用类型的互相转换
C#语言中的所有类型都是由基类System.Object继承过来的,包括最常用的基础类型:int, byte, short,bool等等,就是说所有的事物都是对象。如果申明这些类型的时候都在堆(HEAP)中分配内存,会造成极低的效率
.NET如何解决这个问题呢?正是通过将类型分成 值类型 和引用类型
值类型包括(Sbyte、Byte、Short、Ushort、Int、Uint、Long、Ulong、Char、Float、Double、Bool、Decimal)、枚举(enum)、结构(struct),
引用类型包括:类、数组、接口、委托、字符串等。
值型就是在栈中分配内存,引用型是在堆中分配内存
装箱就是隐式的将一个值型转换为引用型对象。比如:
int i=0;
object obj=i;
这个过程就是装箱!
拆箱就是将一个引用型对象转换成任意值型!比如:
int i=0;
object obj=i;
int j=(int)obj;
最后一句是将obj拆箱!
那我们知道了装箱和拆箱是怎么回事,分析下为什么会报错呢?

2、报错的原因

long a = 1;
object b = a;
int c = (int)b;
编译器知道b是object类型的对象,但拆箱的时候只能转换成long型,与int型不匹配所以报了错。
如果想转可以采用下面两种方式
int c = Convert.ToInt32(b);
int c = (int)(long)b;

本站大部分文章、数据、图片均来自互联网,一切版权均归源网站或源作者所有。

如果侵犯了您的权益请来信告知我们删除。邮箱:1451803763@qq.com