c# object类型的问题

object a = 2;
console.WriteLine(a);
console.WriteLine(a.GetType)
//输出结果: 2 System.int

object a =2 ;
int b = a;
//这样就会出错,不能隐式转换, a的类型为object
//但是在上面的例子中为什么,就能直接输出a的值,而不用进行拆箱,
//而运行显示的类型是拆箱后的值类型。
//是不是编译器偷偷的做了些工作,有点糊涂,求指教
w

是的,是实现了隐式转换和显示转换。

因为所有类都继承自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();
上面这个就是,跟不下去了。
也许其实现就是这样吧,无从解释了。

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-04-24
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类型无关

第2个回答  2012-04-24
object a = 2; 装箱,因为不论解释成什么类型,object都兼容,所以就可以存,这个没疑问。但是 int b = a; 拆箱的时候不允许隐式拆箱,因为会涉及到内存大小,而GetType返回的一定是继承自object的类,估计默认是int或者根据一定规则返回的时候就返回int,但是拆箱的时候为了防止内存泄露,强制需要你显示转换

C#中问题 “object”不包含“Text”的定义,并且找不到可接受类型为“o...
你这是Label,TextBox类型,object需要拆箱操作。object作为父类不可能直接使用子类的属性。在变量声明中将object改成对应的Label和TextBox,然后在Click事件中可以直接使用属性直接赋值。一直说C#是强类型语言,通俗地讲,便是指C#中的“变量”在开发时的类型便是明确的:String便是String,Int32就是Int32,...

C# object转换类型问题
对于Object来说,有值相等和引用相等两种,在你的例子中str和strCopy是值相等而不是引用相等,因为str和strCopy是两个不同的对象,存在内存不同的地址,所以他们不是引用相等;str和strCopy的值都是"this is a string.",所以他们是值相等的。判断引用相等用==,判断值相等用Equals(object)。

c#: 运算符“>=”无法应用于“object”和“int”类型的操作数 这怎么解...
你是不是想表达说如果有数据的话,就执行什么什么操作吧。if(this.dataGridView1.ColumnCount >=0)\/\/获取gridview数据的列数。那个.DataSource 是object类型。

关于C#的object小问题
首先m他指向了常量池中的abc的内存地址,后来n又等于了m,等于说是把abc的指针赋给了n,这个n指向了那个内存地址,那个内存地址中的数据为abc,你用m和n做比较的话,因为他们都是指向的同一个内存地址,所以说等于ture。至于object类型的话,他是一个引用类型,每一个objec都有一个属于自己的内存地...

c# 菜鸟对object对象的疑问??
object是所有类的基类,就是祖宗 不用写class myClass:object 你生下来的时候你的祖宗早就有了..还需要去定义你是他的子孙吗

c#object问题
object对象作为函数参数时,并不都是使用引用方式,那要看具体的object对象的原型是什么,也可以是值类型。比如当object为int, uint, byte, string, Guid 等类型时,是进行值拷贝的,并不只是传递一个引用。对于C#的对象变量,我更倾向于它是一个指针,虽然.net貌似在非安全代码时没有所谓的指针。但...

C#中关于object做函数参数的问题,,初级问题哈
1种方法:result_2 = (fuhaozu_n[j]as 你的实际类型).gailv;2种方法:using System.Collections;using System.Collections.Generic;static int kaibian(IList<YourClass> fuhaozu_n)result_2 = fuhaozu_n[j].gailv;建议使用第二种方法,泛型集合,强类型,不需要类型转换 ...

C#中用object做中间类的引用转换问题
当然是true,因为object b可以强制转换为A的对象,所以为true 即可以A c=(A)b;如果提供的对象可以强制转换为所提供的类型而不会导致引发异常,则 is 表达式的计算结果将是 true 请注意,is 运算符只考虑引用转换、装箱转换和取消装箱转换。不考虑其他转换,如用户定义的转换。

谁给我介绍一下C#里面的Object类
1、C# 的 object 是所有托管类型的根类,任何一个托管类型都直接或者间接继承 object,另外 object 实际上就是 System.Object。2、Object类是C#中的基类类型,所有的对象都派生于它,因此,值类型数据可以隐式转换为Object类型,把这种情况称之为装箱;否则,若将一个Object类型的数据转换为值类型,需要...

C#序列化如何处理object类型的值
如果是二进制方式序列化的,object是不能直接序列化的。例如Object p = new Object();这个p是不能序列化的。如果是从Object派生的类型,如果该类型添加了SerializableAttribute的元数据属性,那么该类型可以被运行库自动以二进制方式序列化。

相似回答