c# object类型的问题 15
objecta=2;console.WriteLine(a);console.WriteLine(a.GetType)//输出结果:2System.intobjecta=...
object a = 2;
console.WriteLine(a);
console.WriteLine(a.GetType)
//输出结果: 2 System.int
object a =2 ;
int b = a;
//这样就会出错,不能隐式转换, a的类型为object
//但是在上面的例子中为什么,就能直接输出a的值,而不用进行拆箱,
//而运行显示的类型是拆箱后的值类型。
//是不是编译器偷偷的做了些工作,有点糊涂,求指教
w 展开
console.WriteLine(a);
console.WriteLine(a.GetType)
//输出结果: 2 System.int
object a =2 ;
int b = a;
//这样就会出错,不能隐式转换, a的类型为object
//但是在上面的例子中为什么,就能直接输出a的值,而不用进行拆箱,
//而运行显示的类型是拆箱后的值类型。
//是不是编译器偷偷的做了些工作,有点糊涂,求指教
w 展开
3个回答
展开全部
是的,是实现了隐式转换和显示转换。
因为所有类都继承自object,所以2可以隐式转化为object。
但object却没有类似的实现,所以不能隐式转换。 int b = (int)a;这样就可以了。
可以搜索下implicit和explicit关键字,这个用来实现隐式和显示转换。
当然,你举得是一个值类型和引用类型的特殊例子,才会有拆箱和装箱。你如果是用string 和object互转,也会有相同的问题,就不涉及什么拆箱装箱了。
因为所有类都继承自object,所以2可以隐式转化为object。
但object却没有类似的实现,所以不能隐式转换。 int b = (int)a;这样就可以了。
可以搜索下implicit和explicit关键字,这个用来实现隐式和显示转换。
当然,你举得是一个值类型和引用类型的特殊例子,才会有拆箱和装箱。你如果是用string 和object互转,也会有相同的问题,就不涉及什么拆箱装箱了。
追问
你没回答我最核心的问题console.WriteLine(a);
console.WriteLine(a.GetType);
为什么没有对a进行强制类型转换,类型向上可以隐式转换,向下必须要强制转换啊,
而且为什么输出的a的类型是int 而不是object。
追答
那这个就得看object的GetType是怎么实现的了。
[MethodImpl(MethodImplOptions.InternalCall), SecuritySafeCritical]
public extern Type GetType();
上面这个就是,跟不下去了。
也许其实现就是这样吧,无从解释了。
展开全部
object a = 2; //这是个简单的装箱过程 不需要强转
当 CLR 对值类型进行装箱时,会将该值包装到 System.Object 内部,再将后者存储在托管堆上。取消装箱将从对象中提取值类型。 装箱是隐式的;取消装箱是显式的。
自己去研究一下装箱和拆箱吧
当 CLR 对值类型进行装箱时,会将该值包装到 System.Object 内部,再将后者存储在托管堆上。取消装箱将从对象中提取值类型。 装箱是隐式的;取消装箱是显式的。
自己去研究一下装箱和拆箱吧
追问
对于装箱和拆箱我很清楚,对c#类型转换机制我系统的学过。
object a= 2; 这是一个装箱过程,装箱是向上隐式转换;
拆箱是向下显示转换,必须要显示声明的;你仔细看我的问题
问题的核心是当object a = 2; 此时a 的类型应该是object, 但
我测试下输出的却是a的拆箱类型。
追答
如果是这样object a = 2.2
那么输出的就是System.Double
主要是a指向的是什么样的数据类型
和下面的int b=(int)a 的int类型无关
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
object a = 2; 装箱,因为不论解释成什么类型,object都兼容,所以就可以存,这个没疑问。但是 int b = a; 拆箱的时候不允许隐式拆箱,因为会涉及到内存大小,而GetType返回的一定是继承自object的类,估计默认是int或者根据一定规则返回的时候就返回int,但是拆箱的时候为了防止内存泄露,强制需要你显示转换
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询