带有可选参数的构造函数是否重载了?

时间:2015-08-25 17:23:41

标签: c# clr language-specifications

以下是代码示例:

public List(int capacity = defaultCapacity) {
    items = new T[capacity];
}

C# 5 Language Specification Section 1.6.7写道:

  

实例构造函数可以重载。例如,列表   class声明了两个实例构造函数,一个没有参数和   一个接受int参数的。

但是为此代码编译IL不包含2个构造函数。它只包含这个声明:

.method public hidebysig specialname rtspecialname 
        instance void  .ctor([opt] int32 capacity) cil managed

这意味着可选参数为CLR级别,由[opt]定义。

CLR之后,没有运行时可以使用2个重载的构造函数来表示此对象。

例如,如果我创建2个单独的构造函数而没有可选参数,则编译IL将包含2个.ctor -s。

我想澄清一下,如果语言规范说class declares two instance constructors不是,那就意味着编译的IL也会包含2 ctor - s。

1 个答案:

答案 0 :(得分:6)

可选参数,无论是否在方法或构造函数上使用,都不会引入额外的重载。相反,可选参数用[opt]标记,无论何时调用它而没有指定参数值,可选值将包含在已编译的代码中。

因此,当您更改可选参数的默认值时,需要重新编译所有用法,以便将新值注入所有调用。如果你不这样做,将使用旧的值。

<强>更新

来自规范的引用令人困惑。如果它只用一个带有可选参数的构造函数来讨论1.6.7中定义的List<T>,那么它就错了。