我收到以下错误:
"属性在当前上下文中不存在"。
我检查了StackOverflow的常见原因,但我没有提出任何错误。 (至少没有一个我理解^^)。我正在使用Microsoft Visual Studio 2015
这是我的代码:
namespace ConsoleApplication5
{
public class Voiture
{
public int Vitesse { get; set; }
public Voiture()
{
Vitesse = 5;
}
public string Marque
{
get
{
throw new System.NotImplementedException();
}
set
{
}
}
}
}
并在另一个文件中
namespace ConsoleApplication5
{
public class Audi : Voiture
{
public void Deraper()
{
Console.WriteLine("Vroooouum !!");
}
this.Marque = "Audi";
}
}
如果我使用this.Marque
代替Voiture.Marque
,我会遇到同样的问题。
如您所见,命名空间是可以的。知道发生了什么事吗?
答案 0 :(得分:7)
1)不允许您访问和初始化方法体外的继承属性。您只能在那里声明新的属性或字段。
2)Marque
类型为int
,您无法为其分配string
3)你的Marque
的setter是空的,所以这没有效果
解决方案:
1)将this.Marque
的访问权移动到构造函数或方法体中!
2)将Marque
的类型更改为string
或将您指定给它的值更改为int
3)添加一个额外的私有字段,并按以下方式重写setter(和getter):
private int marque;
public int Marque
{
get
{
return marque;
}
set
{
marque = value;
}
}
有关如何使用属性的更多信息,您可以查看以下链接:
https://www.dotnetperls.com/property
编辑:
如果我使用
this.Marque
代替Voiture.Marque
,我会遇到同样的问题。
这是因为第一个问题仍然有效。如果你在方法体内执行此操作,则会遇到其他问题!由于Marque
不是static
,因此您无法通过使用类名调用它来使用它。您需要一个类型为Voiture
答案 1 :(得分:2)
您的代码存在两个问题。
int
,您正试图设置string
使用此代码,您将了解问题1
public Audi()
{
this.Marque = "Audi";
}
答案 2 :(得分:2)
问题是你缺乏对OOP的基本理解。您正在尝试从类范围分配基类属性,这不是它在OOP中的工作方式。你必须创建一些" callable"范围,例如。构造函数,并在该范围内分配您父项的字段/属性:
public class Audi : Voiture {
// Draper() ...
public Audi() : base() {
Marque = "Audi";
}
}
更具描述性的答案:
类范围内的所有内容都称为定义,其中的每个其他范围都称为实现。既然您已经在父类中定义了(定义了)该字段/属性,那么您必须在一个实现中分配它,在该实现中,该字段/属性的访问修饰符允许您或者在同一时刻使用#39 ;重新定义此字段/属性。
答案 3 :(得分:2)
在C#中,您无法在类体中初始化属性。您应该在构造函数中初始化它们:
namespace ConsoleApplication5
{
public class Audi : Voiture
{
Audi() {
this.Marque = "Audi";
}
public void Deraper()
{
Console.WriteLine("Vroooouum !!");
}
}
}