C# 错误 CS0266:无法将类型“Dog”隐式转换为“罗威纳犬”

本文关键字:转换 罗威纳 罗威纳犬 错误 Dog 类型 CS0266 | 更新日期: 2023-09-27 18:26:53

发生错误时,我正在尝试从一本书中使用以下代码。我正在研究它是由于错误使用作为关键字而生成的。请帮我修复此错误。此代码是子类化的示例。此代码生成两个错误 (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);
    }
}

C# 错误 CS0266:无法将类型“Dog”隐式转换为“罗威纳犬”

虽然你可以将Spaniel投射到Dog,但你不能反过来。所以这段代码:

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

正在强制转换为Dog,然后尝试将其存储在Spaniel变量中。但是,您可以这样做:

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

同样如 @leppie 所述,不需要 as Dog 强制转换,因为存在从派生类到其基的隐式强制转换:

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

好吧,在这里:Rottweiler butch = new Rottweiler("Butch") as Dog;创建Rottweiler实例并将其强制转换为Dog

现在还可以,但是您将Dog实例分配给类型为 Rottweiler 的变量 - 但这是不可能的。

由于Rottweiler是从Dog继承而来的,所以每个Rottweiler都是Dog的,但不是每个Dog都是Rottweiler的——因此在赋值期间的这种隐式强制转换是无法完成的。

因此,要么删除演员表以Dog

Rottweiler butch = new Rottweiler("Butch");

或将butch类型更改为Dog

Dog butch = new Rottweiler("Butch");

请注意,在这种情况下,您也不需要显式强制转换... as Dog,它将通过赋值隐式完成;