有点弄不清楚对象作参数传递的时候类型是怎么转化的,比如
// cs_keyword_is.cs
// The is operator.
using System;
class Class1
{
}
class Class2
{
}
class Class3 : Class1
{
}
class IsTest
{
static void Test1(Class1 c)
{
Console.WriteLine(c.GetType().ToString());//c3传进来时,输出为Class3
}
static void Test(object o)
{
Console.WriteLine(o.GetType().ToString());//c1传进来时,输出为Class1
Class1 a;
Class2 b; if (o is Class1)
{
Console.WriteLine("o is Class1");
a = (Class1)o;
// Do something with "a."
}
else if (o is Class2)
{
Console.WriteLine("o is Class2");
b = (Class2)o;
// Do something with "b."
}
else
{
Console.WriteLine("o is neither Class1 nor Class2.");
}
}
static void Main()
{
Class1 c1 = new Class1();
Class2 c2 = new Class2();
Class3 c3 = new Class3();
Test(c1);
Test(c2);
Test1(c3);
Test("a string");
}
}c1传进去的时候是不是转换为object类型啊,为什么会是Class1类型的啊
还有c3传给Test1时,不先转化为Class1类型吗,为什么输出的是Class3类型啊??谢谢
// cs_keyword_is.cs
// The is operator.
using System;
class Class1
{
}
class Class2
{
}
class Class3 : Class1
{
}
class IsTest
{
static void Test1(Class1 c)
{
Console.WriteLine(c.GetType().ToString());//c3传进来时,输出为Class3
}
static void Test(object o)
{
Console.WriteLine(o.GetType().ToString());//c1传进来时,输出为Class1
Class1 a;
Class2 b; if (o is Class1)
{
Console.WriteLine("o is Class1");
a = (Class1)o;
// Do something with "a."
}
else if (o is Class2)
{
Console.WriteLine("o is Class2");
b = (Class2)o;
// Do something with "b."
}
else
{
Console.WriteLine("o is neither Class1 nor Class2.");
}
}
static void Main()
{
Class1 c1 = new Class1();
Class2 c2 = new Class2();
Class3 c3 = new Class3();
Test(c1);
Test(c2);
Test1(c3);
Test("a string");
}
}c1传进去的时候是不是转换为object类型啊,为什么会是Class1类型的啊
还有c3传给Test1时,不先转化为Class1类型吗,为什么输出的是Class3类型啊??谢谢
Class2 c2 = new Class2();
Class3 c3 = new Class3();
最后结果是跟他是实例有关的
不论是c1/c2/c3,被实例化是,反射出来的都是它的实例类型
(2)还有c3传给Test1时,不先转化为Class1类型吗,为什么输出的是Class3类型啊??
c3不先转化为Class1类型,Class3只是继承Class1(如继承Class1中的方法,构造函数,索引批示器等等)
这里跟反射不搭界
c就是类型Class3
using System;public class MyBaseClass: Object {
}public class MyDerivedClass: MyBaseClass {
}public class Test { public static void Main() {
MyBaseClass myBase = new MyBaseClass();
MyDerivedClass myDerived = new MyDerivedClass();
object o = myDerived;
MyBaseClass b = myDerived; Console.WriteLine("mybase: Type is {0}", myBase.GetType());
Console.WriteLine("myDerived: Type is {0}", myDerived.GetType());
Console.WriteLine("object o = myDerived: Type is {0}", o.GetType());
Console.WriteLine("MyBaseClass b = myDerived: Type is {0}", b.GetType());
}
}
/*This code produces the following output.mybase: Type is MyBaseClass
myDerived: Type is MyDerivedClass
object o = myDerived: Type is MyDerivedClass
MyBaseClass b = myDerived: Type is MyDerivedClass */
c1传进去的时候是不是转换为object类型啊,为什么会是Class1类型的啊
//注意这里不是把c1转化为object,而是把c1的地址赋给obj而已,其地址所代表实例的类型依然是Class1还有c3传给Test1时,不先转化为Class1类型吗,为什么输出的是Class3类型啊??谢谢
//同样也不是你所为的转化,输出自然还是Class3了!