c# - 方法重载决议系统如何决定在传递空值时调用哪个方法?

标签 c# .net overload-resolution

例如你有这样一个类型:

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

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

我可以自己测试这个,但我想了解重载解析系统是如何工作的(不确定它是不是这么叫的)。

最佳答案

有关确切规则,请参阅 the overload resolution spec .但简而言之,它是这样的。

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

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 version 比所有版本都更不具体,因此可以将其删除。 IEnumerable<object>版本不如 object[] 具体版本(你知道为什么吗?)所以它也可以被删除。剩下

public EffectOptions ( object[] options )
public EffectOptions ( string name )

现在我们被困住了。 object[]不比 string 更具体或更不具体.因此,这会产生歧义错误。

这只是一个简短的草图;真正的打破平局的算法要复杂得多。但这些都是基础。

关于c# - 方法重载决议系统如何决定在传递空值时调用哪个方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5173339/

相关文章:

.net - 工作单元实现

C# .NET 图表库/代码?

.net - 将连接字符串传递给 dll?

c# - 使用动态参数的方法重载决议

c# - 根据集合中现有对象的属性,使用 LINQ 将对象插入集合中

c# - 为实现 INotifyCollectionChanged 的​​集合返回 IEnumerable<T> 是一种好习惯吗

c# - 为什么这些对象没有被处理掉

c# - 使用 C# 将 HTML 字符串作为 JSON 输出

c++ - 字符串文字匹配 bool 重载而不是 std::string

casting - 当存在不同的重载时强制向上转型