给定代码:
public class A
{
public A()
{
throw new Exception();
}
}
public class B : A
{
public B(int i)
{
}
}
然后运行该行:
var x = new B(2);
我永远不会期望 A
的构造函数被命中(除非我添加 base()
)到 B
的末尾构造函数声明。
奇怪的是它似乎被击中(并抛出异常)。这是默认行为吗?这让我很吃惊,因为我完全没想到 A
的构造函数会被命中
最佳答案
如果您不包含任何 base(..)
或 this(..)
,它的作用与您拥有 base( )
。来自 C# spec :
如果实例构造函数没有构造函数初始值设定项,则隐式提供 base()
形式的构造函数初始值设定项。因此,形式的实例构造函数声明
C(...) {...}
完全等同于
C(...): base() {...}
您可能一直在寻找使 A
成为 abstract class
的方法,这样您就无法直接创建 A
的实例。
public abstract class A
{
}
public class B : A
{
public B(int i)
{
}
}
public static void Main()
{
// A a = new A(); // doesn't compile
A a = new B(2); // valid
}
关于c# - 基类构造函数被击中而不调用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18852179/