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
展开
 我来答
styshoo1986
推荐于2017-11-25 · TA获得超过893个赞
知道小有建树答主
回答量:832
采纳率:100%
帮助的人:265万
展开全部
是的,是实现了隐式转换和显示转换。

因为所有类都继承自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();
上面这个就是,跟不下去了。
也许其实现就是这样吧,无从解释了。
王敏zj
2012-04-24 · 超过42用户采纳过TA的回答
知道小有建树答主
回答量:167
采纳率:100%
帮助的人:83.3万
展开全部
object a = 2; //这是个简单的装箱过程 不需要强转
当 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类型无关
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
314659476
2012-04-24 · TA获得超过1836个赞
知道大有可为答主
回答量:2162
采纳率:66%
帮助的人:569万
展开全部
object a = 2; 装箱,因为不论解释成什么类型,object都兼容,所以就可以存,这个没疑问。但是 int b = a; 拆箱的时候不允许隐式拆箱,因为会涉及到内存大小,而GetType返回的一定是继承自object的类,估计默认是int或者根据一定规则返回的时候就返回int,但是拆箱的时候为了防止内存泄露,强制需要你显示转换
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式