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#可以用相同的参数重载两个方法,只要其中一个方法有默认参数?
基础教程推荐
- rabbitmq 的 REST API 2022-01-01
- 为什么Flurl.Http DownloadFileAsync/Http客户端GetAsync需要 2022-09-30
- SSE 浮点算术是否可重现? 2022-01-01
- 如何激活MC67中的红灯 2022-01-01
- MS Visual Studio .NET 的替代品 2022-01-01
- 有没有办法忽略 2GB 文件上传的 maxRequestLength 限制? 2022-01-01
- c# Math.Sqrt 实现 2022-01-01
- 将 Office 安装到 Windows 容器 (servercore:ltsc2019) 失败,错误代码为 17002 2022-01-01
- 将 XML 转换为通用列表 2022-01-01
- 如何在 IDE 中获取 Xamarin Studio C# 输出? 2022-01-01