解决错误“没有给出与所需形式参数相对应的参数”?
Posted
技术标签:
【中文标题】解决错误“没有给出与所需形式参数相对应的参数”?【英文标题】:Resolve error 'there is no argument given that corresponds to required formal parameter'? 【发布时间】:2016-12-10 01:41:24 【问题描述】:我有以下代码,在 C# Visual Studio 2015 中编译时出现错误。
class Oval:Shape
private double major_axis, minor_axis;
public Oval(double Major_Axis, double Minor_Axis)
major_axis = Major_Axis;
minor_axis = Minor_Axis;
//Constructor
class Circle:Oval
private double radius;
public Circle(double Circle_Radius) // Getting Error on this line
radius = Circle_Radius;
//constructor
【问题讨论】:
顺便说一句,现在是开始学习 .NET 命名约定的好时机。 但如果您确实遵循命名约定,那么每个人都更容易阅读。为什么您认为约定对您的真实代码有用,但在示例代码中却没有? 在最新的更新中,我遵循了所有的约定。谢谢。 没有编码错误的相同错误 - 关闭并打开解决方案 【参考方案1】:修复错误:
由于缺少无参数构造函数(或者您没有在构造函数中使用base()
方法(就像user3185569
所说的那样)导致错误发生
修复您的代码:
显然,您似乎缺乏 .NET 的一些基础知识,因此我决定重写您的代码,并牢记以下几点:
一个。 约定
有一些关于应适用于您的代码的通用约定的规则。
成员通常以m
或_
开头,然后是memberName
(驼峰式)。
属性通常写成PropertyName
,同样适用于方法。
参数和变量只是像parameterName
这样的驼峰式大小写
b. 访问修饰符
我不知道您的 Oval 和 circle 的用途,但我假设您希望在 Oval
和 Circle
之外访问它们。
我认为最好在此处引用您以阅读有关该主题的更多信息:https://msdn.microsoft.com/en-us/library/ms173121.aspx
我已经重写了您的代码以包含所有这些提示(并且还解决了您的问题)
public class Oval:Shape
//Constructor
public Oval(double majorAxis, double minorAxis)
MajorAxis=majorAxis;
MinorAxis=minorAxis;
protected double MajorAxis get; set;
protected double MinorAxis get; set;
public class Circle:Oval
//Constructor
public Circle(double radius): base(radius,radius)
radius = Circle_Radius;
public double Radius
get
return MajorAxis;
set
MajorAxis = value;
MinorAxis = value;
【讨论】:
【参考方案2】:由于Circle
继承自Oval
,因此当您创建Circle
时,会在您的情况下调用Oval
的默认构造函数。由于该构造函数接受 2 个参数,因此您需要显式调用构造函数并提供它们:
class Circle : Oval
private double radius;
public Circle(double Circle_Radius) : base(0, 0) // change to whatever values
radius = Circle_Radius;
所以Circle
是Oval
,所以它有major_axis
和minor_axis
值。您只是没有提供它们,因为它们是创建 Oval
所需的值。
当然,您可以为 Oval
添加一个不带参数的默认公共构造函数,但这会使您创建一个没有 major_axis
和 minor_axis
的 Oval,并且在您的当前状态下,这两者似乎都是唯一的构造函数所必需的代码。因此,您需要重新考虑如何设计您的课程。
【讨论】:
如果你不想将值提供给Oval
类的构造函数,那么你可以在椭圆类中定义一个parameterless constructor
。 public Oval() major_axis = 0; minor_axis = 0;
@RichaGarg 我不敢说我自己,因为这样你就可以创建一个没有长轴和短轴的Oval
。这似乎不是 OP 想要的情况。这引发了关于继承设计的问题,但对我来说事情并不是那么清楚。
是的,你是对的!一切都取决于设计。但是,通过这种方法,我们可以为长轴和短轴定义一些默认值。【参考方案3】:
您需要将基类构造函数更新为以下内容:
class Oval:Shape
private double major_axis, minor_axis;
public Oval(double Major_Axis, double Minor_Axis)
major_axis = Major_Axis;
minor_axis = Minor_Axis;
//Constructor
class Circle:Oval
private double radius;
public Circle(double Circle_Radius):base(12.2,12.2) // pass value to base class constructor
radius = Circle_Radius;
//constructor
~```
【讨论】:
【参考方案4】:你也可以在 Base 类中添加一个空的构造函数。
public Shape()
或
public Oval()
这不会强制您使用 2 参数构造函数。
【讨论】:
【参考方案5】:class Oval : Shape
#region Constants
private const double dblPIE = 3.14d;
#endregion
#region Member_Variables
private double m_dblMajorRad = 0.0d;
private double m_dblMinorRad = 0.0d;
#endregion
#region Constructors
/// <summary>
/// default constructor
/// </summary>
public Oval()
/// <summary>
/// initializes Major Radius and Minor Radius of oval
/// </summary>
/// <param name="dblOvalMajorRad"></param>
/// <param name="dblOvalMinorRad"></param>
public Oval(double dblOvalMajorRad, double dblOvalMinorRad)
m_dblMajorRad = dblOvalMajorRad;
m_dblMinorRad = dblOvalMinorRad;
#endregion
class Circle : Oval
#region Constants
private const double dblPIE = 3.14d;
#endregion
#region Member_Variables
private double m_dblRadius = 0.0d;
#endregion
#region Constructors
/// <summary>
/// initializes radius
/// </summary>
/// <param name="dblRadius"></param>
public Circle(double dblRadius)
m_dblRadius = dblRadius;
#endregion
【讨论】:
仅发布代码作为答案在 *** 上并不是一个好习惯。我的回答将您引向真正的问题,因此我找不到您将其恢复为不被接受的理由。此外,您提供的解决方案在我的答案的 cmets 中进行了说明,并说明了为什么它不是一个好的选择。 @Dhiraj-sardal 你需要用文字描述你修改过的代码。以上是关于解决错误“没有给出与所需形式参数相对应的参数”?的主要内容,如果未能解决你的问题,请参考以下文章
Asp.net Boilerplate - 没有给出与所需形式参数相对应的参数
“没有给出与所需形式参数相对应的参数”-尝试测试OOP继承时[重复]