基于http://msdn.microsoft.com/en-us/library/aa288208%28v=vs.71%29.aspx
结构构造函数类似于类构造函数,但以下区别除外:
结构不能包含显式 无参数构造函数。结构 成员是自动的 初始化为默认值。
结构体不能有初始化器 形式为:base(argument-list)。
我有理解第2项的问题。有人可以给我一个具体的例子吗?
答案 0 :(得分:1)
基本上,结构不支持继承。虽然从技术上讲它们确实从基类对象继承,但第2项规定您不能显式调用基类构造函数。 更多信息:http://msdn.microsoft.com/en-us/library/aa288471%28v=vs.71%29.aspx
答案 1 :(得分:1)
struct
(隐式)直接从System.ValueType
派生,而abstract
类上唯一的构造函数是protected
且无参数。这些都是语言规范的事实,你质疑的陈述是这些事实的结果,并在§11.3.8的语言规范中明确说明:
不允许
struct
实例构造函数包含base(...)
形式的构造函数初始值设定项。
对于派生自具有可访问的非参数构造函数的类的引用类型,您可以执行以下操作:
class Base {
private readonly string baseName;
public string BaseName { get { return this.baseName; } }
public Base(string baseName) { this.baseName = baseName; }
}
class Derived : Base {
private readonly string derivedName;
public string DerivedName { get { return this.derivedName; } }
public Derived(string baseName, string derivedName) : base(baseName) {
this.derivedName = derivedName;
}
}
关键是Derived
是Base
,因此需要调用Base
的构造函数来完全初始化Derived
的新实例(即,需要初始化Derived
的{{1}}部分。通过语法Base
调用基础构造函数可以调用相应的构造函数。
您对base(...)
提出质疑的声明声明不允许进行此类调用。这主要是因为根据本答复第一句中所述的事实,永远不会有这样的构造函数。
答案 2 :(得分:0)
以下是初始化程序的示例:base(argument-list)。
public class Foo
{
public Foo(int i) { Debug.WriteLine(i); }
}
public class Bar: Foo
{
public Bar() : base(4) {} // Prints '4' to debug via the base class's constructor.
}
结构不支持继承,因此不允许显式调用基类的构造函数。