我们经常写这样的代码:
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
{
}
{
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,编译也没问题。{
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
{
}
费了老大劲,才找到关于这个问题的说明:
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参数还有这问题呢?照着平常的思路老是走不通,还道是继承的有问题呢,还好,总算把原因搞清楚了
{
[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
{
}