【问题标题】:Class does not contain contstructor error类不包含构造函数错误
【发布时间】:2014-06-30 06:32:40
【问题描述】:

我对编程比较陌生,而且我刚刚开始上课。 问题是,我的编译器正在返回

“错误 1 ​​'OlioohjelmoinninPerusteet.Blogimerkinta' 不包含 带 1 个参数的构造函数”

我不知道如何解决这个问题,这是我的代码。

using System;
namespace OlioohjelmoinninPerusteet
{
    class Blogimerkinta
    {
        string teksti;
        string[] avainsanat;

        public string Teksti { get; set; }
        public string[] Avainsanat { get; set; }
    }

    class Ohjelma
    {
        static void Main()
        {
            string otsikko = "Otsikko";
            Blogimerkinta merkinta = new Blogimerkinta(otsikko);
            merkinta.Teksti = "Teksti";
            merkinta.Avainsanat = new string[] { "Eka", "Toka" };
        }
    }
}

【问题讨论】:

  • 这是日语吗?只是想知道!
  • 天啊!!!! 9 个答案,还在数...
  • @Rahul 不确定它是什么,但它不是日语。是的……突然提出这个问题的人数之多令人震惊。其中超过一半是 1K+
  • @gitsitgo 这是芬兰语。

标签: c# class oop


【解决方案1】:

By default, if you do not specify a constructor it is the same as below

如果你没有为你的对象提供构造函数,C# 将创建 默认情况下实例化对象并设置成员变量的一种 到默认值表中列出的默认值(C# 参考)。

Using Constructors (C# Programming Guide)

不带参数的构造函数称为默认构造函数 构造函数。每当一个对象被调用时,就会调用默认构造函数 使用 new 操作符实例化并且不提供任何参数 到新的。

除非类是静态的,否则没有构造函数的类会被赋予一个 C# 编译器的公共默认构造函数以启用类 实例化。

class Blogimerkinta
{
    string teksti;
    string[] avainsanat;

    public string Teksti { get; set; }
    public string[] Avainsanat { get; set; }
    public Blogimerkinta()
    {
    }
}

您正在调用未指定的构造函数,即

    public Blogimerkinta(string TADA)
    {
    }

【讨论】:

    【解决方案2】:

    你正在新建一个对象并为构造函数传递一个参数:

    Blogimerkinta merkinta = new Blogimerkinta(otsikko);
    

    此对象没有带任何参数的构造函数,默认情况下,您可以使用所有 c# 对象获取的默认构造函数,不带参数:

    Blogimerkinta merkinta = new Blogimerkinta();
    

    或创建一个接受字符串参数的构造函数:

    public Blogimerkinta(string arg) 
    {
        //use argument for something
    }
    

    【讨论】:

    • 尽管您使用了“newing up”,但您仍会获得 +1。动词怪异的语言。
    • 只是你的标准编程术语 =)
    • 您的解释是英文的,但示例是日文的。这是不可接受的。 :)
    • 这些例子是芬兰语,@Rahul
    【解决方案3】:

    你需要像这样为你的类添加一个构造函数:

    class Blogimerkinta
    {
        string teksti;
        string[] avainsanat;
    
        public string Teksti { get; set; }
        public string[] Avainsanat { get; set; }
    
        public Blogimerkinta(string otsikko)
        {
            this.teksti = otsikko;
        }
    }
    

    【讨论】:

      【解决方案4】:

      如果你没有定义一个默认构造函数(你没有定义),C# 会创建一个默认构造函数,并且默认构造函数没有参数并且不做任何事情。相当于这样:

      public Blogimerkinta()
      {
      }
      

      为了使用带有参数的构造函数(我假设在内部将对象的属性设置为该参数的值),您需要定义一个。像这样的:

      public Blogimerkinta(string teksti)
      {
          this.Teksti = teksti;
      }
      

      (或者设置您想要在内部设置的任何值。目前您的类只有一个 string 类型的属性,但命名使您不清楚这是否是您要设置的值。)

      【讨论】:

        【解决方案5】:

        好吧,您正在尝试创建Blogimerkinta 的实例并将字符串参数传递给构造函数。但是,您的类上没有任何带有字符串参数的构造函数。要么创建构造函数,要么使用默认值创建实例的无参数构造函数:

        Blogimerkinta merkinta = new Blogimerkinta();
        

        【讨论】:

          【解决方案6】:

          您的 Blogimerkinta 没有为它定义构造函数。在编译期间,将生成一个不带参数的默认值。如果您希望您的类在实例化期间接受参数,请创建一个接受参数的构造函数。

           class Blogimerkinta
              {
                  public Blogimerkinta(string foo){
                   //do something with foo
                  }
                  string teksti;
                  string[] avainsanat;
          
                  public string Teksti { get; set; }
                  public string[] Avainsanat { get; set; }
              }
          

          【讨论】:

            【解决方案7】:

            这一行用一个参数调用构造函数。

            Blogimerkinta merkinta = new Blogimerkinta(otsikko);

            要解决此问题,您必须创建一个。

            class Blogimerkinta
            {
                string teksti;
                string[] avainsanat;
            
                public Blogimerkinta(){} // This is parameterless constructor
                public Blogimerkinta(string input)
                {
                    if(input != null)
                        teksti = input; //You initialize class fields here or do other stuff
                }
                public string Teksti { get; set; }
                public string[] Avainsanat { get; set; }
            }
            

            正如您在 Main() 中看到的,您传递了一个 string 值,因此构造函数必须采用一个字符串值,以使用该值(可能更多值)初始化其字段/字段

            查看msdn,因为他们解释得很好。

            http://msdn.microsoft.com/en-us/library/ace5hbzh.aspx

            【讨论】:

            • 仅供参考:您不需要测试字符串 input 是否为空。
            • @NathanKoop 很好,因为string 是引用类型,它可以是null,因此通常没有人愿意使用null
            • 但是您正在将一个字符串分配给一个字符串,因此使用您的代码,如果输入为空,teksti 将设置为什么?
            • @NathanKoop 为 null,我知道,但测试您的输入是一种很好的编程习惯,因为该字符串不会在该类中的某个位置使用。
            • @NathanKoop 好吧不是,但由于 OP 是编程新手,他应该从一开始就学习好的做法:)
            【解决方案8】:

            一个类有 1 个或多个构造函数。如果您不提供一个,编译器将创建一个空的: 当您说“new Blogimerkinta()”时,会调用构造函数 您正在调用一个带有参数的构造函数: new Blogimerkinta(otsikko) 但你没有定义构造函数。

            你需要定义这个构造函数:

            public Blogimerkinta(string s) {
                teksti = s; //I don't know which field you want to assign, just an example
            }
            

            (所以它看起来是一个方法,但没有返回类型,并且与类同名)

            如果不定义构造函数,只能调用'new Blogimerkinta()'

            【讨论】:

              【解决方案9】:

              这是一个通用修复:

              class Blogimerkinta
                  {
                      string teksti;
                      string[] avainsanat;
                      string foo="";
                      public Blogimerkinta(string bar)
                      {
                            foo=bar;
                      }
                      public string Teksti { get; set; }
                      public string[] Avainsanat { get; set; }
                  }
              

              【讨论】:

              • 由于 OP 需要提高他的 OOP 知识,您可以改进您的答案以添加对所涉及概念(构造函数)的解释,而不仅仅是提供有效的修复。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-12-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-02-16
              相关资源
              最近更新 更多