解决错误“没有给出与所需形式参数相对应的参数”?

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 的用途,但我假设您希望在 OvalCircle 之外访问它们。

我认为最好在此处引用您以阅读有关该主题的更多信息: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;  
    

所以CircleOval,所以它有major_axisminor_axis 值。您只是没有提供它们,因为它们是创建 Oval 所需的值。

当然,您可以为 Oval 添加一个不带参数的默认公共构造函数,但这会使您创建一个没有 major_axisminor_axis 的 Oval,并且在您的当前状态下,这两者似乎都是唯一的构造函数所必需的代码。因此,您需要重新考虑如何设计您的课程。

【讨论】:

如果你不想将值提供给Oval类的构造函数,那么你可以在椭圆类中定义一个parameterless constructorpublic 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 你需要用文字描述你修改过的代码。

以上是关于解决错误“没有给出与所需形式参数相对应的参数”?的主要内容,如果未能解决你的问题,请参考以下文章

在 Unity 脚本中:没有给出与所需形式参数相对应的参数

Asp.net Boilerplate - 没有给出与所需形式参数相对应的参数

“没有给出与所需形式参数相对应的参数”-尝试测试OOP继承时[重复]

我需要在 multiplyMatrixByConstant 方法中使用矩阵数组,但我不确定如何

在 CLion 中调试时程序收到分段错误

我在披露指标中看到了双 V 形。为啥以及如何解决这个问题? [关闭]