有关确切的规则,请参阅重载决议规范。但简而言之,它是这样的。
首先,列出所有可访问的构造函数。
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[]
你明白为什么吗?)所以它也可以被消除。那离开
public EffectOptions ( object[] options )
public EffectOptions ( string name )
现在我们被困住了。object[]
既不比也不比具体string
。因此,这会产生歧义错误。
那只是一个简短的草图;真正的平局算法要复杂得多。但这些是基础。