我怎样才能做以下事情?
调用A
后我的GetB
对象为空,即使A
继承自B
。
class Program
{
public class A : B
{
}
public class B
{
}
static void Main(string[] args)
{
A a = GetB() as A;
Console.WriteLine(a == null); // it is null!
Console.WriteLine("Console.ReadKey();");
Console.ReadKey();
}
public static B GetB()
{
return new B();
}
}
答案 0 :(得分:4)
你可能在函数中意味着return new A();
。目前,您正试图将B
向下投射到A
,这将无效。
答案 1 :(得分:1)
你反过来了:
class Program
{
public class A : B // should be: public class A
{
}
public class B // should be: public class B : A
{
}
static void Main(string[] args)
{
// If you reverse the inheritance on code above
// As Ben Voigt noticed, *as A* is redundant. should be removed
// A a = GetB() as A;
// should be this. B is wider than A, so A can accept B, no need to cast
A a = GetB();
Console.WriteLine(a == null); // it is null!
Console.WriteLine("Console.ReadKey();");
Console.ReadKey();
}
public static B GetB()
{
return new B();
}
}
答案 2 :(得分:1)
您将无法执行此类投射,因为B
很可能不是A
!当然,A
是B
的子类,因此您始终可以执行GetA() as B;
。但走另一条路是没有意义的;很可能A
的实例在B
的实例上提供了一些额外的功能。
考虑添加第三个类C : B
。如果您的函数GetB()
实际返回new C()
怎么办?这很好,因为C
是B
。但当然你不希望能够将它转换为A
? A
和C
几乎肯定没什么共同之处。
答案 3 :(得分:1)
你试图将你的B转变为A.你不能这样做,也不能有意义,因为我们不知道B是否会成为A.建立一个构造函数会更好在A
类中,以B
作为参数。
public class A : B
{
public A(B b)
{
//perform your conversion of a B into an A
}
}
public class B
{
public B(){}
}
static void Main(string[] args)
{
B b = new B();
A a = new A(b);
Console.WriteLine(a == null); // it is null!
Console.WriteLine("Console.ReadKey();");
Console.ReadKey();
}