一尘不染

当传递空值时,方法重载解决方案系统如何确定要调用哪个方法?

c#

因此,例如,您有一个类似的类型:

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);

哪个构造函数将被调用,为什么?

我可以自己测试一下,但我想了解过载解析系统的工作原理(不确定是否是所谓的)。


阅读 314

收藏
2020-05-19

共1个答案

一尘不染

有关确切规则,请参阅重载分辨率规范。但是简单地说,它是这样的。

首先,列出所有 可访问的 构造函数。

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。因此,这产生了歧义错误。

那只是一个简短的草图;真正的平局决胜法要复杂得多。但这是基础。

2020-05-19