错误"存在显式转换(您是否错过了演员表)"在创建对象时出现:

时间:2014-04-03 12:24:38

标签: c# asp.net inheritance

我有兴趣学习OOP概念。在尝试使用继承的简单程序时。我注意到了这个错误。我无法理解为什么会出现这种错误?我在下面给出了简单的c#代码:

class Animal
{
    public void Body()
    {
        Console.WriteLine("Animal");
    }
}
class Dog : Animal
{
    public void Activity()
    {
        Console.WriteLine("Dog Activity");
    }
}

class Pomeranian : Dog
{
    static void Main(string[] args)
    {
        //Dog D = new Dog();
        Dog D = new Pomeranian();    -----> No error occur at this line
        Pomeranian P = new Dog();    -----> Error occur at this line
        D.Body();
        D.Activity();
        Console.ReadLine();
    }             
}

任何人请告诉我那里发生了什么......

4 个答案:

答案 0 :(得分:9)

您必须了解每只狗都是动物的概念,但并非所有动物都是狗

Program是一个可怕的名字,让我们摆脱它并使之成为Pomeranian:现在一切都将被清除。

Pomeranian P = new Dog();//This is not valid because not all dogs are Pomeranian.

但您可以执行以下操作

Dog d = new Pomeranian();//You know why this works :)

我希望这会有所帮助。

答案 1 :(得分:2)

您无法从类型child创建父实例。它违反了继承的概念。

答案 2 :(得分:2)

博美犬是一只狗,但狗不一定是博美犬。这在现实生活中是真的,当你的面向对象的类正确地相互继承时,这是真的。在现实生活中,您对狗进行DNA测试以验证它是否是博美犬。在.NET Framework中,我们有一些函数和运算符可以帮助我们。

让我们确定您确定Dog的实例实际上是Pomeranian。您可以执行显式演员。

Dog dog = new Pomeranian();
Pomeranian pomeranian = (Pomeranian)dog; //explicit cast. This works. Would throw an InvalidCastException if the dog isn't a Pomeranian

您希望确定实例实际上是您要转换的类型,以避免异常。一种方法是使用GetType()typeof().

Dog dog = new Pomeranian();

if(dog.GetType() == typeof(Pomeranian))
{
    Pomeranian p = (Pomeranian)dog; //explicit cast won't throw exception because we verified what we're doing is valid.
}

另一种方法是使用as运算符。

Dog dog = new Pomeranian();
Pomeranian pomeranian = dog as Pomeranian; //If the dog isn't actually a Pomeranian, the pomeranian would be null.

使用as运算符基本上等同于......

Dog dog = new Pomeranian();
Pomeranian pomeranian = null;

if(dog.GetType() == typeof(Pomeranian))
{
    pomeranian = (Pomeranian)dog;
}

显然,当你的所有代码都是同一块时,通过观察它就很容易分辨出基础类型。但是当你开始使用泛型集合和其他类似的东西并且你在课堂之间传递它们时,有时你不知道类型是什么,并且在演出之前检查类型变得很重要。

请参阅MSDN上的Casting and Type Conversions

答案 3 :(得分:1)

Program子类Dog以来,您无法从Program获得Dog

但是对于多态性,ProgramDog,但不是相反。