C#错误CS0266:无法隐式转换类型';狗';至';罗威纳

C#错误CS0266:无法隐式转换类型';狗';至';罗威纳,c#,casting,C#,Casting,发生错误时,我正在从一本书中尝试以下代码。我认为它是因为as关键字的错误使用而生成的。请帮我纠正这个错误。这段代码是子类化的一个例子。此代码生成两个错误(cs0266)。生成错误的行位于Main方法中,并在行上方用注释标记 class Program { static void Main(string[] args) { // CS0266: Cannot implicitly convert type 'Dog' to 'Rottweiler R

发生错误时,我正在从一本书中尝试以下代码。我认为它是因为as关键字的错误使用而生成的。请帮我纠正这个错误。这段代码是子类化的一个例子。此代码生成两个错误(cs0266)。生成错误的行位于Main方法中,并在行上方用注释标记

class Program
{
    static void Main(string[] args)
    {
        // CS0266: Cannot implicitly convert type 'Dog' to 'Rottweiler
        Rottweiler butch = new Rottweiler("Butch") as Dog;

        // CS0266: Cannot implicitly convert type 'Dog' to 'Spaniel
        Spaniel mac = new Spaniel("Mac", "yips") as Dog;

        butch.Bark();
        mac.Bark();
        butch.DoYourThing();
        mac.DoYourThing();
    }
}
class Dog
{
    protected string _name;
    protected string _sound;

    public Dog(string name)
    {
        _name = name; _sound = "barks";
    }

    public Dog(string name, string sound)
    {
        _name = name;
        _sound = sound;
    }

    public void Bark()
    {
        Console.WriteLine("{0} {1} at you", _name, _sound);
    }

    public virtual void DoYourThing()
    {
    }
}

class Rottweiler : Dog
{
    public Rottweiler(string name) : base(name) { }
    public Rottweiler(string name, string sound) : base(name, sound) { }

    public override void DoYourThing()
    {
        Console.WriteLine("{0} snarls at you, in a very menacing fashion!", _name);
    }
}
class Spaniel : Dog
{
    public Spaniel(string name) : base(name) { }
    public Spaniel(string name, string sound) : base(name, sound) { }

    public override void DoYourThing()
    {
        Console.WriteLine("{0} drools all over you, then licks you into submission!", _name);
    }

}

虽然你可以把
Spaniel
换成
Dog
,但你不能反过来。所以这个代码:

Spaniel mac = new Spaniel("Mac", "yips") as Dog;
正在转换为
,然后尝试将其存储在
西班牙犬
变量中。但是,您可以执行以下操作:

Dog mac = new Spaniel("Mac", "yips") as Dog;
正如@leppie所提到的,
as Dog
cast是不需要的,因为存在从派生类到其基的隐式cast:

Dog mac = new Spaniel("Mac", "yips");

虽然你可以把
Spaniel
换成
Dog
,但你不能反过来。所以这个代码:

Spaniel mac = new Spaniel("Mac", "yips") as Dog;
正在转换为
,然后尝试将其存储在
西班牙犬
变量中。但是,您可以执行以下操作:

Dog mac = new Spaniel("Mac", "yips") as Dog;
正如@leppie所提到的,
as Dog
cast是不需要的,因为存在从派生类到其基的隐式cast:

Dog mac = new Spaniel("Mac", "yips");

好的,这里:
rotweiler butch=新罗威犬(“butch”)作为狗您正在创建<代码>罗威纳
的实例,并将其投射到<代码>狗

现在仍然可以,但是您将
Dog
的实例分配给
rotweiler
类型的变量-但这是不可能的

由于
罗特韦尔犬
是从
继承而来的,所以每个
罗特韦尔犬
都是
,但并非每个
都是
罗特韦尔犬
——因此,在分配期间无法进行此隐式转换

因此,要么移除对
狗的投射

Rottweiler butch = new Rottweiler("Butch");
或者将
butch
的类型更改为
Dog

Dog butch = new Rottweiler("Butch");

注意,在这种情况下,您也不需要显式cast
。。。作为Dog
,它将通过赋值隐式完成

好吧,这里:
罗威犬布奇=新罗威犬(“布奇”)作为狗您正在创建<代码>罗威纳
的实例,并将其投射到<代码>狗

现在仍然可以,但是您将
Dog
的实例分配给
rotweiler
类型的变量-但这是不可能的

由于
罗特韦尔犬
是从
继承而来的,所以每个
罗特韦尔犬
都是
,但并非每个
都是
罗特韦尔犬
——因此,在分配期间无法进行此隐式转换

因此,要么移除对
狗的投射

Rottweiler butch = new Rottweiler("Butch");
或者将
butch
的类型更改为
Dog

Dog butch = new Rottweiler("Butch");

注意,在这种情况下,您也不需要显式cast
。。。作为Dog
,它将通过赋值隐式完成

作为狗
?这是多余的,甚至可能是另一个错误;p感谢您的帮助和快速响应:)
作为一只狗
?这是多余的,甚至可能是另一个错误;p感谢您的帮助和快速响应:)您应该始终发布错误消息,而不仅仅是错误代码,以避免人们不得不查找错误代码的含义。您的编译器不应该只向您提供错误代码,它会向您提供类似
error CS0266:Cannot隐式地将类型“object”转换为“int”。存在显式转换(是否缺少强制转换?)
试着理解这些,你肯定会节省时间问这个问题。谢谢你的警告,从现在起我将发布整个错误消息:)而且我还是一个初学者,在阅读了答案后,我感到有点惭愧,因为这是我应该知道的。将来我会更加小心。再次感谢。您应该始终发布错误消息,而不仅仅是错误代码,以避免人们不得不查找错误代码的含义。编译器不应该只给您错误代码,它会给您类似于
error CS0266:无法隐式地将类型“object”转换为“int”。存在显式转换(是否缺少强制转换?)
试着理解这些,你肯定会节省时间问这个问题。谢谢你的警告,从现在起我将发布整个错误消息:)而且我还是一个初学者,在阅读了答案后,我感到有点惭愧,因为这是我应该知道的。将来我会更加小心。再次感谢。感谢您的帮助和快速响应:)感谢您的帮助和快速响应:)