没有给出对应于 'Person.Person(string, string)' 的必需形式参数 'firstName' 的参数

Muh*_*raz 3 c# oop inheritance constructor default-constructor

好的,所以我有两个简单的类,Person 和 Employee。

人:

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public Person(string firstName, string lastName)
    {
        FirstName = firstName;
        LastName = lastName;
    }
}
Run Code Online (Sandbox Code Playgroud)

员工:

public class Employee : Person
{
    public string DepartmentName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

简单吧?雇员继承人,但是有问题。员工类给了我一个错误,说必须调用父类的构造函数。现在类似问题的答案说我应该调用基类的构造函数,它将解决问题。它的作用。

我的问题是,当员工类本身没有自己的构造函数时,为什么要调用基类的构造函数?

一本名为 MCSD 认证 70-483 的书说:

这个系统的一个奇怪之处在于您可以创建一个没有构造函数的 Employee 类,即使这允许程序创建 Employee 类的实例而无需调用 Person 类构造函数。这意味着 Employee 类的以下定义是合法的:

public class Employee : Person
{
 public string DepartmentName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我的情况和这本书上写的完全一样。这本书说,如果孩子没有自己的构造函数,继承而不调用基类的构造函数是合法的。为什么我仍然收到此错误?即使我有相同的实现。

这本 2018 年的书是否过时/有错误?难道我做错了什么?或者 C# 中的新更新不允许子类,如果它不调用父类的构造函数?

Ste*_*pUp 7

看起来这是一个错字。因为继承中每个派生类型的构造函数都应该隐式或显式调用基构造函数。

像这样的构造函数:

public Employee () {}
Run Code Online (Sandbox Code Playgroud)

是隐含的:

public Employee () : base() {}
Run Code Online (Sandbox Code Playgroud)

但是,Person没有无参数构造函数,所以它是一个错误的原因:

CS7036 没有给出与“Person.Person(string, string)”的所需形式参数“firstName”相对应的参数

可以做的是使用默认值创建构造函数:

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public Person(string firstName = null, string lastName = null)
    {
        FirstName = firstName;
        LastName = lastName;
    }
}
Run Code Online (Sandbox Code Playgroud)

那么Employee没有构造函数的类将有资格:

public class Employee : Person
{
     public string DepartmentName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)