什么是对“;结构不能具有形式为:base(参数列表)的初始值设定项&”;

本文关键字:参数 列表 base 结构 不能 什么 | 更新日期: 2023-09-27 17:58:30

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

结构构造函数类似于类构造函数,除了以下不同:

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

  2. 结构不能有初始值设定项形式为:base(参数列表)。

我理解第2项有问题。有人能给我举个具体的例子吗?

什么是对“;结构不能具有形式为:base(参数列表)的初始值设定项&”;

基本上,结构不支持继承。尽管在技术上它们确实继承自基类对象,但第2项指出,您不能显式调用基类构造函数。更多信息请点击此处:http://msdn.microsoft.com/en-us/library/aa288471%28v=vs.71%29.aspx

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的新实例(即,需要初始化使其成为BaseDerived的部分)。通过语法base(...)调用基构造函数可以调用适当的构造函数。

您所质疑的关于struct的声明指出,不允许进行这样的调用。这主要是因为根据这个答案第一句中陈述的事实,永远不可能有这样的构造函数。

下面是一个初始化器的示例,其形式为:base(参数列表)。

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.
}

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