【问题标题】:The type "MyProject.Bike" does not contain a constructor that takes '0' arguments C#“MyProject.Bike”类型不包含采用“0”参数的构造函数 C#
【发布时间】:2012-02-01 14:44:43
【问题描述】:

我的问题可能很简单,但我刚开始用 C# 编程。

我的问题是,如上所述:“类型“MyProject.Bike”不包含采用“0”参数的构造函数”。

我不明白,因为我不会尝试用空括号调用这个构造函数,并且阅读类似的问题都回答为“你必须有太多/没有足够的参数......”。

我只是为了学习而做的,但我认为继承是一个非常重要的概念,所以我希望能够做到这一点......

我的代码:

using System;  
namespace MijnConsoleProject
{
    public class Bike
    {
        protected int speed = 0;
        public String name
        {
            get;
            set;
        }
        public void speedUp(int increment)
        {
            this.speed += increment;
        }
        public void slowDown(int decrement)
        {
            this.speed -= decrement;
            {

        public override string ToString ()
        {
            return name + ": speed = " + speed;
        }

        public Bike(int initSpeed)
        {
            this.speed = initSpeed;
        }
    }

    public class GearedBike : Bike
    {
        private int gear;

        public GearedBike(string name)
        {
            this.name = name;
        }

        public bool changeGear(int gear)
        {
            if(gear < 8 && gear > 0)
            {
                this.gear = gear;
                return true;
            }
            else
            {
                return false;
            }
        }

        public override string ToString ()
        {
             return name + ": speed=" + speed + ", gear=" +gear;
        }

        public static void main(String[] args)
        {
            Bike fiets = new Bike(10);
            Console.WriteLine("[Normal Bike:]");
            Console.WriteLine("{0}\n", fiets);

            GearedBike fiets2 = new GearedBike("Fiets");
            Console.WriteLine("[Geared Bike:]");
            Console.WriteLine("{0}\n", fiets2);
        }
    }
}

【问题讨论】:

  • 嘿,第二部分高亮了!但第一部分仍然不是......
  • 它在哪一行告诉你有错误?
  • 您需要将代码缩进 4 个空格。或者选择它并点击 {} 按钮。
  • 这一行:public GearedBike(string name)

标签: c# inheritance constructor


【解决方案1】:

你的Bike 类只有一个构造函数:

    public Bike(int initSpeed)
    {
        this.speed = initSpeed;
    }

这需要一个参数。

当你派生一个类时,派生类的构造函数从基类调用构造函数。

GearedBike 类的构造函数中,您没有指定要调用 Bike 的哪个构造函数,因此编译器假定 Bike() 不存在。

您可能想要如下所示的内容,我们指定要调用的基本构造函数,并传入适当的值。

    public GearedBike(string name)
        : base(0)
    {
        this.name = name;
    }

您可能还需要一个 GearedBike 构造函数,您可以在其中设置速度和名称,如下所示:

    public GearedBike(string name, int initSpeed)
        : base(initSpeed)
    {
        this.name = name;
    }

【讨论】:

  • 我可以在基类的构造函数中得到一个变量吗?
  • 我认为您需要再等几分钟才能让您接受。
  • 是的,它是这么说的,但这是为什么呢?
  • 我想给其他人时间来回答,如果一个问题有一个例外的答案,其他人就不太可能回答它。您可以在meta 上提问(尽管先搜索)。另请参阅此问题:Allow me to accept an answer immediately
【解决方案2】:

构造函数public GearedBike(string name) { ... }public GearedBike(string name) : base() { ... }的简写

您必须使用子类构造函数中的参数调用基类构造函数,或者将 0 参数构造函数添加到基类。

public GearedBike(string name) : base(42) {
  // ...
}

【讨论】:

    【解决方案3】:

    构造函数没有被继承,所以在类中你必须调用基类constructr:

    public GearedBike(string name):base(name)
            {
                this.name = name;
            }
    

    如果你的基类有一个无参数构造函数,你不需要这样做

    【讨论】:

      【解决方案4】:

      GearedBike 不会调用基类的构造函数。如果没有显式调用基类的构造函数,编译器会调用基类的默认构造函数。基类不包含默认构造函数;因此,您会收到一个错误说明。

      【讨论】:

        【解决方案5】:

        C# 编译器可以生成一个可能看起来像的默认构造函数

        public Bike()
        {
        
        }
        

        只有当类型没有任何用户定义的构造函数时才会发生这种情况。在您的情况下, Bike 类有一个带有 int 的构造函数:

        public Bike(int initSpeed)
        {
            this.speed = initSpeed;
        }
        

        Thefore 编译器不会为您生成默认的无参数构造函数。


        稍后在您的代码中,GearedBike 类型通过调用 :base()(由编译器添加)使用父类型的构造函数,并且此调用失败,因为基类中没有无参数构造函数。

        【讨论】:

          猜你喜欢
          • 2013-02-16
          • 2013-03-07
          • 2013-02-16
          • 1970-01-01
          • 2023-03-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-10
          相关资源
          最近更新 更多