今天被out参数玩了一把

王朝c#·作者佚名  2006-12-16
宽屏版  字体: |||超大  

原文见:今天被out参数玩了一把

我们经常写这样的代码:

public class Class2

{

private void InvokeTest()

{

Derive d = new Derive();

Test(d);

}

private void Test(Base b)

{

}

}

class Base

{

}

class Derive : Base

{

}

class Derive1 : Base

{

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

public class Class2

{

private void InvokeTest()

{

Derive d = new Derive();

Test( out d);

}

private void Test( out Base b)

{

b = ......

}

}

class Base

{

}

class Derive : Base

{

}

class Derive1 : Base

{

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

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

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

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

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

class Class1

{

[STAThread]

static void Main(string[] args)

{

BaseClass y ;

Test( out y ,typeof(DeriveClass2) );

y.WriteName();

Console.ReadLine();

}

static void Test( out BaseClass y ,Type t )

{

y = BaseClass.CreateInstance(t);

}

}

class BaseClass

{

public static BaseClass CreateInstance(Type deriveClassType)

{

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

}

public void WriteName()

{

Console.WriteLine(this.ToString());

}

}

class DeriveClass : BaseClass

{

}

class DeriveClass2 : BaseClass

{

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有