因为我是C#的新手,所以试图探索这些东西。我在这里想出了一个含糊不清的地方,
根据MSDN: - 如果您需要从基本类型转换为参考类型的派生类型,则需要显式强制转换
这是the link。 所以我尝试了一个示例程序
interface I1
{
void FirstInterface();
}
class A
{
public void FirstInterface()
{
Console.WriteLine("FirstInterface Implemented in Class A");
}
}
class B : A
{
public void ClassBMethods()
{
Console.WriteLine("Class B methods");
}
}
Void Main()
{
A baseClass = new A();
B derivedClass = (B)baseClass; //Converting from base type to derived type
//B derivedClass = baseClass as B; -> null
}
但是当我试图做一个明确的演员时我得到了Invalid Cast Exception
。任何人都可以帮我解决这个问题。我不确定我在这里误解了什么。
答案 0 :(得分:1)
baseClass
实例不属于B
类型。它的类型为A
。任何数量的强制转换都不会使其成为B
类型。
请尝试以下操作。
A baseClass = new B();
B derivedClass = (B)baseClass;
B otherDerivedClass = baseClass as B;
注意 A baseClass = new B();
所以想一想,圆圈总是一个形状,但形状并不总是圆形。考虑到这一点,以下内容是有道理的:
Shape shape = new Circle();
Circle circle = (Circle)shape;
以下情况不是:
Shape shape = new Shape();
Circle circle = (Circle)shape;
在前者中,形状被实例化为为圆形,因此您可以来回投射。在后者中,形状不是圆形,所以你不能投射圆圈。
答案 1 :(得分:0)
那是因为baseClass
不属于B
类型。对于像这样的事情,明确的铸造会更多
A baseReference = new B();
B derivedReference = (B)baseReference;
或者为了安全起见而使用as
代替,如果投射失败,将返回默认值(在引用类型的情况下为null
)。
A a = new A();
A aRefOfB = new B();
B aAsB = a as B;
B aRefOfBAsB = aRefOfB as B;
在这种情况下,aAsB
将为null
而aRefOfBAsB
则不会。
但总的来说,如果可能的话,你应该更喜欢一种不需要你做任何明确演员表的设计。