有点弄不清楚对象作参数传递的时候类型是怎么转化的,比如
// 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类型啊??谢谢

解决方案 »

  1.   

    不论是C1,C2,C3,反射出来的都是它的实例类型
      

  2.   

    Class1 c1 = new Class1(); 
    Class2 c2 = new Class2(); 
    Class3 c3 = new Class3(); 
    最后结果是跟他是实例有关的
      

  3.   

    (1)c1传进去的时候是不是转换为object类型啊,为什么会是Class1类型的啊
       不论是c1/c2/c3,被实例化是,反射出来的都是它的实例类型
    (2)还有c3传给Test1时,不先转化为Class1类型吗,为什么输出的是Class3类型啊??
       c3不先转化为Class1类型,Class3只是继承Class1(如继承Class1中的方法,构造函数,索引批示器等等)
      

  4.   

    不论是c1/c2/c3,被实例化是,反射出来的都是它的实例类型 
      

  5.   

    GetType()是个虚函数,楼主如果理解什么是虚函数就能知道是怎么回事了。
    这里跟反射不搭界
      

  6.   

    我的意思是继承类的对象c3传递给使用它所继承的类作为参数的函数Test1(Class1 c)或者时,能传进去吗,为什么?能传进去的话,这时候的c是什么类型的,Class1类型还是Class3?
      

  7.   

    可以传进去,C#支持类型的upcast,
    c就是类型Class3
      

  8.   

    楼上,为什么是Class3类型的,参数类型不是Class1类型的吗
      

  9.   

    object 是所有对象的基类,你定义的类Class1等等都继承了该类,用Object作为参数,任何对象都可以传递过去作为参数。
      

  10.   

    这个问题msdn上有例子可以参考
    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 */
      

  11.   

    http://msdn.microsoft.com/en-us/library/system.object.gettype.aspx
      

  12.   


    c1传进去的时候是不是转换为object类型啊,为什么会是Class1类型的啊 
    //注意这里不是把c1转化为object,而是把c1的地址赋给obj而已,其地址所代表实例的类型依然是Class1还有c3传给Test1时,不先转化为Class1类型吗,为什么输出的是Class3类型啊??谢谢 
    //同样也不是你所为的转化,输出自然还是Class3了!
      

  13.   

    那这里面c1是如何判断能将它的地址传给object o的,它们是不同的类型啊,是因为c1继承自object吗?