引用类型c#中的显式转换

时间:2016-03-16 19:04:51

标签: c#

因为我是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。任何人都可以帮我解决这个问题。我不确定我在这里误解了什么。

2 个答案:

答案 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将为nullaRefOfBAsB则不会。

但总的来说,如果可能的话,你应该更喜欢一种不需要你做任何明确演员表的设计。