为什么基类必须有一个带0参数的构造函数?
这不会编译:
namespace Constructor0Args { class Base { public Base(int x) { } } class Derived : Base { } class Program { static void Main(string[] args) { } } }
相反,我收到以下错误:
‘Constructor0Args.Base’不包含带0参数的构造函数
这是为什么? 基类是否需要一个带0参数的构造函数?
它不是 – 问题是它需要调用一些基础构造函数,以初始化基类型, 默认是调用base()
。 您可以通过在derived-types构造函数中自己指定特定的构造函数(和参数)来调整它:
class Derived : Base { public Derived() : base(123) {} }
对于base
(或者替代地, this
)构造函数的参数,您可以使用:
- 当前构造函数的参数
- 文字/常量
- 静态方法调用(也涉及上述)
例如,以下内容也是有效的,使用上面的所有三个项目符号:
class Derived : Base { public Derived(string s) : base(int.Parse(s, NumberStyles.Any)) {} }
从另一个派生类时,将在派生类构造函数之前调用基类。 当您没有显式调用构造函数时,您实际上是在编写
class Derived : Base { public Derived() : base() { } }
由于Base类没有0参数构造函数,因此无效。
如果没有为类显式定义构造函数,则会自动定义默认构造函数,如下所示:
public Derived() : base() { }
您需要在基类上指定构造函数以及传递给它的参数:
public Derived() : base(1) { }
这是因为当实例化子类时,它还将实例化基类。 默认情况下,它会尝试查找arg less构造函数。 这适用于此代码:
class Base { public Base(int x) { } } class Derived : Base { public Derived(int x) : base(x) { } }
- 通过.net应用程序将报告文件上传到报告管理器?
- 从控制台读取一行中的数字,用空格分隔
- 如何查找列表中的元素是否在另一个列表中?
- 如何在MVC中单击按钮时将模型从视图传递到控制器?
- 即使我正在检查,也从EventLog.CreateEventSource接收“…已经注册…”!EventLog.SourceExists
- System.StringComparer和System.StringComparison类之间的区别?
- 即使旧索引和新索引相同,是否可以触发ComboBox SelectedIndex Changed Event?
- 如何在不使用Assembly.Load的情况下加载程序集?
- DPI意识 – 在一个版本中不知道,在其他版本中意识到系统