以下是代码示例:
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。
答案 0 :(得分:6)
可选参数,无论是否在方法或构造函数上使用,都不会引入额外的重载。相反,可选参数用[opt]标记,无论何时调用它而没有指定参数值,可选值将包含在已编译的代码中。
因此,当您更改可选参数的默认值时,需要重新编译所有用法,以便将新值注入所有调用。如果你不这样做,将使用旧的值。
<强>更新强>
来自规范的引用令人困惑。如果它只用一个带有可选参数的构造函数来讨论1.6.7中定义的List<T>
,那么它就错了。