我正在使用Microsoft Virtual Academy学习C#。这是我正在使用的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Variables
{
class Program
{
static void Main(string[] args)
{
Car myCar = new Car("BWM", "745li", "Blue", 2006);
printVehicleDetails(myCar);
Console.ReadLine();
}
}
abstract class Vehicle
{
public string Make { get; set; }
public string Model { get; set; }
public int Year { get; set; }
public string Color { get; set; }
public abstract string FormatMe();
public static void printVehicleDetails(Vehicle vehicle)
{
Console.Writeline("Here are the vehicle's details: {0}", vehicle.FormatMe());
}
}
class Car : Vehicle
{
public Car(string make, string model, string color, int year)
{
Make = make;
Model = model
Color = color;
Year = year;
}
public override string FormatMe()
{
return string.Format("{0} - {1} - {2} - {3}",
this.Make,
this.Model,
this.Color,
this.year);
}
}
无论如何,我遇到的问题来自printVehicleDetails(myCar)
行。当我尝试构建项目时,我收到错误“当前上下文中不存在名称'printVehicleDetails'。
我可以通过将行更改为Vehicle.printVechicleDetails(myCar)
来修复错误。
有谁知道为什么我必须在该行中加入Vehicle
?
答案 0 :(得分:5)
因为printVehicleDetails
是Vehicle
类上的静态方法。当你调用静态方法时(在你所在的类之外的类上),你需要包含类名,以便编译器知道要绑定到哪个方法。
答案 1 :(得分:2)
printVehicleDetails
是一种静态方法。要访问它,您必须告诉它该方法的位置,这就是将其更改为Vehicle.printVehicleDetails
的原因。
或者,您可以从static
的签名中删除printVehicleDetails
,无需传递车辆参数,然后通过myCar.printVehicleDetails();
进行调用。
public void printVehicleDetails()
{
Console.Writeline("Here are the vehicle's details: {0}", this.FormatMe());
}
顺便说一句,printVehicleDetails
并未向普遍接受的C# naming standards确认。它应该是PrintVehicleDetails()
。
答案 2 :(得分:1)
您有printVehicleDetails
作为静态方法,这意味着它属于整个类而不属于实例,例如您的myCar
变量。你的工作原理是什么,但它并不理想。在面向对象的世界中,我们希望有对象运行的方法,而不是全局方法(基本上是静态方法)。也就是说,我们不是采用一种带狗的方法让它吠叫,而是采用一种方法对狗进行调用,以便狗可以自行吠叫。
为了适应这种范式,我会完全摆脱printVehicleDetails
并使用FormatMe
。它会在Main
方法中显示为:
Car myCar = new Car("BWM", "745li", "Blue", 2006);
Console.WriteLine("Here are the vehicle's details: " + myCar.FormatMe());
Console.ReadLine();