“结构不能在表单中使用初始化程序:base(argument-list)”是什么意思。

时间:2011-06-07 15:22:55

标签: c#

基于http://msdn.microsoft.com/en-us/library/aa288208%28v=vs.71%29.aspx

结构构造函数类似于类构造函数,但以下区别除外:

  1. 结构不能包含显式 无参数构造函数。结构 成员是自动的 初始化为默认值。

  2. 结构体不能有初始化器     形式为:base(argument-list)。

  3. 我有理解第2项的问题。有人可以给我一个具体的例子吗?

3 个答案:

答案 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;
    }
}

关键是DerivedBase,因此需要调用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.
}

结构不支持继承,因此不允许显式调用基类的构造函数。