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);
}
}
虽然你可以将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
,它将通过赋值隐式完成;