2

这是一个代码示例:

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

C# 5 Language Specification Section 1.6.7写着:

实例构造函数可以重载。例如,List 类声明了两个实例构造函数,一个没有参数,一个接受 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。

4

1 回答 1

6

可选参数,无论是用于方法还是构造函数,都不会引入额外的重载。相反,可选参数用 [opt] 标记,并且每当您在没有指定该参数值的情况下调用它时,该可选值将包含在您的编译代码中。

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

更新

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

于 2015-08-25T17:26:10.763 回答