📌  相关文章
📜  无法为没有参数的类型调用初始化程序 (1)

📅  最后修改于: 2023-12-03 15:26:15.604000             🧑  作者: Mango

无法为没有参数的类型调用初始化程序

当我们在使用某些类的时候,可能会遇到以下的错误信息:

无法为没有参数的类型调用初始化程序

这是因为我们在使用这个类的时候,传入了错误的参数,或者根本没有传入任何参数。

下面我们来看一个简单的例子:

class Person {
  public string Name { get; set; }
  public Person() {
    Name = "default";
  }
  public Person(string name) {
    Name = name;
  }
}

class MainClass {
  public static void Main (string[] args) {
    Person person1 = new Person(); // 报错
    Person person2 = new Person("Tom");
    Console.WriteLine(person1.Name);
    Console.WriteLine(person2.Name);
  }
}

在上面的例子中,我们定义了一个 Person 类,并定义了两个构造函数,分别是不带参数的和带一个字符串类型参数的。然后在 Main 函数中,我们试图通过调用不带参数的构造函数来创建一个 Person 的实例。但是这个时候,编译器就会报错:

无法为没有参数的类型调用初始化程序

这是因为我们在调用 Person 的不带参数的构造函数时,没有传入任何参数,而我们上面定义的不带参数的构造函数也没有默认的实现,所以编译器就会报错。

要解决这个问题,我们有两种方式:

  1. 提供一个默认实现的不带参数的构造函数

我们可以在 Person 类中,再定义一个默认实现的不带参数的构造函数,它不需要任何参数,但是需要调用另一个有参数的构造函数,来初始化 Name 属性的值。具体实现如下:

class Person {
  public string Name { get; set; }
  public Person() : this("default") {
  }
  public Person(string name) {
    Name = name;
  }
}

class MainClass {
  public static void Main (string[] args) {
    Person person1 = new Person(); // 不再报错
    Person person2 = new Person("Tom");
    Console.WriteLine(person1.Name);
    Console.WriteLine(person2.Name);
  }
}

在上面的例子中,我们在 Person 类中,重新定义了一个不带参数的构造函数,并且它的实现是调用有参数的构造函数,并传入一个默认值 "default"

这样,在我们调用不带参数的构造函数时,就会默认调用这个新定义的构造函数,从而顺利地创建一个 Person 的实例了。

  1. 在调用构造函数时,传入正确的参数

如果我们不想在 Person 类中再定义一个构造函数,也可以直接在调用构造函数时,传入正确的参数,如下所示:

class Person {
  public string Name { get; set; }
  public Person(string name) {
    Name = name;
  }
}

class MainClass {
  public static void Main (string[] args) {
    Person person1 = new Person("default"); // 传入一个默认值
    Person person2 = new Person("Tom");
    Console.WriteLine(person1.Name);
    Console.WriteLine(person2.Name);
  }
}

在上面的例子中,我们在调用不带参数的构造函数时,传入了一个默认的字符串 "default",这样就不会再报错了。

总结一下,当我们在使用某个类时,遇到了 无法为没有参数的类型调用初始化程序 错误信息时,应该检查一下是否有以下情况:

  1. 调用了不带参数的构造函数,并且没有传入任何参数,但是该构造函数又没有默认的实现。
  2. 调用了有参数的构造函数,但是传入的参数类型不正确或者缺少参数。

只要解决了这些问题,就可以顺利地使用该类了。