这属于装箱拆箱。我举个例子你就明白了:
专注于为中小企业提供成都做网站、网站设计服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业清远免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了成百上千家企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。
Dim x As Integer = 5
Dim o As Object = x '装箱
Dim y As Integer = CType(o, Integer) '拆箱(在Option Strict Off的情况下,直接用o给y赋值,会发生自动转换,也就是说在这种情况下,你不必显式调用CType函数)
另外:VB.NET支持后期绑定,所以你也可以不进行拆箱,直接在Object类型下就可以调用它的属性和方法
比如,下面的语句在Option Strict Off是是合法的
Dim s As String = 886
Dim i As Integer = "53"
Dim f As Object = New Form()
f.Show() '注意,f是Object类型的
总之,VB.NET的语法要比C#灵活得多
显然是因为编译器不同,产生了不同的IL,分别调用了Converter.ToString(Int32)和Converter.ToString(Object)两个不同的重载 看一下C#的编译器是怎么翻译的(csc.exe)这里假设枚举类型的值是0(MS的编译器对写在代码里面的枚举值,都只是当一个常数处理的,和Const的一样) 在C#里面的:Converter.ToString(枚举)编译出来的结果是:ldc.i4.0 //枚举值是0 box TheEnumType //装箱 call string [mscorlib]System.Convert::ToString(object) //调用Converter.ToString(Object) 在C#里面的:Converter.ToString((int)枚举)编译出来的结果是:ldc.i4.0 //枚举值是0 call string [mscorlib]System.Convert::ToString(int32) //调用Converter.ToString(Int32) call string [mscorlib]System.Convert::ToString(int32) //调用Converter.ToString(Int32) 在VB.Net里面的:Converter.ToString(DirectCast(枚举,object))编译出来的结果是:ldc.i4.0 //枚举值是0 box TheEnumType //装箱 call object [mscorlib]System.Runtime.CompilerServices.RuntimeHelpers::GetObjectValue(object) //调用RuntimeHelpers的GetObjectValue方法 call string [mscorlib]System.Convert::ToString(object) //调用Converter.ToString(Object) 关于这里的RuntimeHelpers的GetObjectValue方法:在MSDN上的描述是:将值类型装箱。MSDN但是为什么C#没有这一步?还不是十分理解这一步的意义 难道VB.Net认为用box装箱还有什么缺点,用上RuntimeHelpers的GetObjectValue方法才算完美?或者还是根本就是多此一举……
object 类型在 .NET Framework 中是 Object 的别名。在 C# 的统一类型系统中,所有类型(预定义类型、用户定义类型、引用类型和值类型)都是直接或间接从 Object 继承的。可以将任何类型的值赋给 object 类型的变量。将值类型的变量转换为对象的过程称为“装箱”。将对象类型的变量转换为值类型的过程称为“取消装箱”。
Object 支持 .NET Framework 类层次结构中的所有类,并为派生类提供低级别服务。这是 .NET Framework 中所有类的最终基类;它是类型层次结构的根。
在代码编辑窗口中就是这样的。在窗体设计的时候那些东西才会显示。