C#错误CS0266:无法隐式转换类型';狗';至';罗威纳
发生错误时,我正在从一本书中尝试以下代码。我认为它是因为as关键字的错误使用而生成的。请帮我纠正这个错误。这段代码是子类化的一个例子。此代码生成两个错误(cs0266)。生成错误的行位于Main方法中,并在行上方用注释标记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
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”。存在显式转换(是否缺少强制转换?)
试着理解这些,你肯定会节省时间问这个问题。谢谢你的警告,从现在起我将发布整个错误消息:)而且我还是一个初学者,在阅读了答案后,我感到有点惭愧,因为这是我应该知道的。将来我会更加小心。再次感谢。感谢您的帮助和快速响应:)感谢您的帮助和快速响应:)