欧冠

今天被out参数玩了一把

2019-10-16 12:59:09来源:励志吧0次阅读

我们经常写这样的代码:

publicclassClass2

{

privatevoidInvokeTest()

{

Derived=newDerive();

Test(d);

}

privatevoidTest(Baseb)

{

}

}

classBase

{

}

classDerive:Base

{

}

classDerive1:Base

{

}

使用基类来表示一个界面,然后传递子类。但是把这段代码改一改:

publicclassClass2

{

privatevoidInvokeTest()

{

Derived=newDerive();

Test(outd);

}

privatevoidTest(outBaseb)

{

b = ......

}

}

classBase

{

}

classDerive:Base

{

}

classDerive1:Base

{

}

按照平常的思路是没问题的,可是连编译都通不过。Why? 是继承体系不对?查一查,没问题。参数类型不对?也没问题,如果把Derive d = new Derive()换成Base d = new Base(),编译是没问题的。或者不使用out,编译也没问题。

费了老大劲,才找到关于这个问题的说明:

out要求传入的参数类型和声明的类型是一致的。原来的是out搞的鬼!对out参数子类到基类的转换是用不成的,

可是如果new的是基类,那么使用基类不就没意义了吗?

没办法,框架是人家写的,人家用了out参数我们也不能怎么样,不过这个问题得搞清楚。要传子类,还得自己想办法,绕个道:

classClass1

{

[STAThread]

staticvoidMain(string[]args)

{

BaseClassy;

Test(outy,typeof(DeriveClass2));

y.WriteName();

Console.ReadLine();

}

staticvoidTest(outBaseClassy,Typet)

{

y=BaseClass.CreateInstance(t);

}

}

classBaseClass

{

publicstaticBaseClassCreateInstance(TypederiveClassType)

{

return(BaseClass)System.Activator.CreateInstance(deriveClassType);

}

publicvoidWriteName()

{

Console.WriteLine(this.ToString());

}

}

classDeriveClass:BaseClass

{

}

classDeriveClass2:BaseClass

{

}

要不是这次碰到这样的问题,我还真不知道out参数还有这问题呢?照着平常的思路老是走不通,还道是继承的有问题呢,还好,总算把原因搞清楚了

上海新科脑康医院怎么样
华西第二医院电话
成都风湿病专科医院预约挂号
北京西京中医医院电话
上海新科脑康医院预约挂号
分享到: