【问题标题】: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 命名约定的好时机。
  • 但如果您确实遵循命名约定,那么每个人都更容易阅读。为什么您认为约定对您的真实代码有用,但在示例代码中却没有?
  • 在最新的更新中,我遵循了所有的约定。谢谢。
  • 没有编码错误的相同错误 - 关闭并打开解决方案

标签: c# oop


【解决方案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
        }
        

        【讨论】:

        • 仅发布代码作为答案在 StackOverflow 上并不是一个好习惯。我的回答将您引向真正的问题,因此我找不到您将其恢复为不被接受的理由。此外,您提供的解决方案在我的答案的 cmets 中进行了说明,并说明了为什么它不是一个好的选择。
        • @Dhiraj-sardal 你需要用文字描述你修改过的代码。
        猜你喜欢
        • 2017-07-18
        • 1970-01-01
        • 2016-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-11
        • 1970-01-01
        相关资源
        最近更新 更多