鉴于代码:
public class A
{
public A()
{
throw new Exception();
}
}
public class B : A
{
public B(int i)
{
}
}
Run Code Online (Sandbox Code Playgroud)
然后运行该行:
var x = new B(2);
Run Code Online (Sandbox Code Playgroud)
我永远不会指望A
构造函数被命中(除非我添加base()
)到B
构造函数声明的结尾.
奇怪的是它似乎受到了打击(抛出异常).这是默认行为吗?这让我感到震惊,因为我完全没想到它A
的构造函数被击中了
如果你不包括任何base(..)
或者this(..)
,它就像你有的一样base()
.来自C#规范:
如果实例构造函数没有构造函数初始值设定项,base()
则隐式提供表单的构造函数初始值设定项.因此,表单的实例构造函数声明
C(...) {...}
Run Code Online (Sandbox Code Playgroud)
完全等同于
C(...): base() {...}
Run Code Online (Sandbox Code Playgroud)
你可能一直在寻找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
}
Run Code Online (Sandbox Code Playgroud)