有关确切的规则,请参见重载决策规范。但简单来说,是这样的。
首先,列出所有可访问的构造函数。
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 )
现在我们必须确定适用候选者中的最佳。最佳规则很复杂,但简短版是越具体越好。长颈鹿比哺乳动物更具体,哺乳动物比动物更具体,动物比对象更具体。
对象
版本不如它们具体,所以可以被排除。 IEnumerable<object>
版本不如object[]
版本具体(你看出原因了吗?),因此也可以被排除。这就留下了:
public EffectOptions ( object[] options )
public EffectOptions ( string name )
现在我们陷入了困境。object[]
与string
一样具体,因此会导致模糊错误。
这只是简要概述;实际的决定性算法要复杂得多。但那些都是基础知识。