因此,例如,您有一个类似的类型:
public class EffectOptions { public EffectOptions ( params object [ ] options ) {} public EffectOptions ( IEnumerable<object> options ) {} public EffectOptions ( string name ) {} public EffectOptions ( object owner ) {} public EffectOptions ( int count ) {} public EffectOptions ( Point point ) {} }
在这里,我仅给出使用构造函数的示例,但是如果它们是类型本身上的非构造方法,则结果将相同。
因此,当您这样做时:
EffectOptions options = new EffectOptions (null);
哪个构造函数将被调用,为什么?
我可以自己测试一下,但我想了解过载解析系统的工作原理(不确定是否是所谓的)。
有关确切规则,请参阅重载分辨率规范。但是简单地说,它是这样的。
首先,列出所有 可访问的 构造函数。
public EffectOptions ( params object [ ] options ) public EffectOptions ( IEnumerable<object> options ) public EffectOptions ( string name ) public EffectOptions ( object owner ) public EffectOptions ( int count ) public EffectOptions ( Point point )
接下来,消除所有 不适用的 构造函数。适用的构造函数是每个形式参数都有对应参数的构造函数,该参数可隐式转换为形式参数类型。假设Point是一个值类型,我们将删除“ int”和“ Point”版本。那离开
public EffectOptions ( params object[] options ) public EffectOptions ( IEnumerable<object> options ) public EffectOptions ( string name ) public EffectOptions ( object owner )
现在,我们必须考虑带有“ params”的参数是适用于其 展开 形式还是 未 展开 形式。在这种情况下,这两种形式都适用。发生这种情况时,我们将放弃 展开的 表格。这样就离开
public EffectOptions ( object[] options ) public EffectOptions ( IEnumerable<object> options ) public EffectOptions ( string name ) public EffectOptions ( object owner )
现在,我们必须确定 最 合适的候选人。最佳规则很复杂,但是简短的规则是, 更具体胜于更具体 。长颈鹿比哺乳动物更具体,哺乳动物比动物更具体,动物比物体更具体。
该object版本比所有版本都不太具体,因此可以删除。该IEnumerable<object>版本不如该版本特定object[](您知道为什么吗?),因此也可以将其删除。那离开
object
IEnumerable<object>
object[]
public EffectOptions ( object[] options ) public EffectOptions ( string name )
现在我们陷入困境。object[]既不比也不具体string。因此,这产生了歧义错误。
string
那只是一个简短的草图;真正的平局决胜法要复杂得多。但这是基础。