CompositeCommand重载构造函数调用可靠性及C#规范依据问询
关于CompositeCommand构造函数重载调用的可靠性与C#规范依据
你遇到的这个构造函数调用行为是完全可信赖的,并且在C#语言规范中有明确的规则支撑。
具体原因:
C#编译器在进行重载决议(选择调用哪个构造函数/方法)时,会优先选择匹配度更高的候选成员,核心规则如下:
- 当两个重载都能匹配调用参数时,编译器会优先选择不需要将所有参数打包进
params数组的重载。 - 对于你的调用场景
new CompositeCommand(aaa, bbb):- 第一个构造函数
CompositeCommand(params ICommand[] commands)需要把传入的aaa和bbb全部打包成一个ICommand[]数组,所有参数都依赖params的数组包装逻辑。 - 第二个构造函数
CompositeCommand(object toolTip, params ICommand[] commands)则会将第一个参数aaa直接隐式转换为object(所有C#类型都继承自object,这是合法的隐式引用转换),第二个参数bbb作为params数组的单个元素进行包装。这里有一个参数是直接匹配到固定参数(非params部分),而非全部依赖params数组,因此这个重载的匹配度更高。
- 第一个构造函数
规范依据:
C#语言规范中明确规定了重载决议的优先级逻辑:在评估候选函数成员时,会比较参数的转换方式和是否依赖params数组包装。不依赖params包装的参数匹配,优先级高于需要params包装的匹配。因此编译器选择第二个构造函数的行为是符合规范的,不会因为C#版本(只要是支持params的版本,即C# 2.0及以上)或编译器实现而改变。
内容的提问来源于stack exchange,提问作者Graviton
相关产品推荐
相关产品推荐

