Why could C# overload two methods with the same params as long as one of them has default param?(为什么C#可以用相同的参数重载两个方法,只要其中一个方法有默认参数?)
问题描述
我最近注意到C#编译器允许方法重载,如下所示:
public static string foo(string a, bool x = false)
{
return "a";
}
public static string foo(string a)
{
return "b";
}
据我测试,只要没有给出第二个参数,它总是返回&b&q;,这是有意义的。但是,我认为编译器确实不应该允许这种类型的重载。请问为什么这个功能是这样设计的,而不是编译器给出错误?
推荐答案
我无法解释为什么这是设计的一部分,也无法简单地解释为什么您在测试中看到哪个重载是受欢迎的。
如果您查看reference documentation,您会注意到以下三个用于描述重载解决方案的项目符号:
- 如果方法、索引器或构造函数的每个参数都是可选的,或者按名称或位置与调用语句中的单个参数相对应,并且该参数可以转换为参数的类型,则该方法、索引器或构造函数是要执行的候选参数。
- 如果找到多个候选项,则首选转换的重载解析规则将应用于显式指定的参数。忽略可选参数的省略参数。
- 如果两个候选人被判断为同样优秀,则优先选择没有可选参数的候选人,这些参数的参数在调用中被省略。重载解析通常首选参数较少的候选项。
我要断言,在您的测试中,项目符号#3最适用于您的观察-因为您省略了第二个参数,并且两种方法都一样好,所以解决方案有利于您的第二个方法,您会看到";b";返回。
这篇关于为什么C#可以用相同的参数重载两个方法,只要其中一个方法有默认参数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:为什么C#可以用相同的参数重载两个方法,只要其中一个方法有默认参数?


- 如何用自己压缩一个 IEnumerable 2022-01-01
- C#MongoDB使用Builders查找派生对象 2022-09-04
- C# 中多线程网络服务器的模式 2022-01-01
- WebMatrix WebSecurity PasswordSalt 2022-01-01
- 在哪里可以找到使用中的C#/XML文档注释的好例子? 2022-01-01
- 输入按键事件处理程序 2022-01-01
- 带有服务/守护程序应用程序的 Microsoft Graph CSharp SDK 和 OneDrive for Business - 配额方面返回 null 2022-01-01
- Web Api 中的 Swagger .netcore 3.1,使用 swagger UI 设置日期时间格式 2022-01-01
- 良好实践:如何重用 .csproj 和 .sln 文件来为 CI 创建 2022-01-01
- MoreLinq maxBy vs LINQ max + where 2022-01-01