【发布时间】:2024-04-16 16:50:02
【问题描述】:
请耐心等待,这不是(完全!)这些 SO 答案的重复:
- Conflicting overloaded methods with optional parameters
- Overload Resolution and Optional Parameters in C# 4
- Call overload method with default parameters
当试图“影响”编译器将选择什么重载时,给定由可选参数引起的冲突,上述帖子中的答案引用了C# Programming Guide,这表明重载解析(OR)启发式在这里发挥作用:
如果两个候选者被判断为同样优秀,则优先考虑没有可选参数的候选者,而该参数在调用中被省略。
很公平。我的问题是,为什么(或为什么不能)Obsolete 属性(或其他一些标记)不会影响 OR 判断两个候选人是否同样优秀的决定?例如,考虑以下重载:
[Obsolete(“This method is deprecated.”)]
[EditorBrowsable(EditorBrowsableState.Never)]]
bool foo() { return true; }
bool foo(bool optional = false) { return optional; }
似乎 OR 不应该判断这些重载同样好——带有可选参数的非弃用重载应该获胜。如果在这个过度简化的示例中是这种情况,那么之前为 foo() 编译的代码将向后兼容并愉快地继续返回 true。为这个库编译的未来代码也可以调用 foo(),但已解决的重载将返回 false。
这是我们语言中缺少的有价值/可能的功能吗?或者有没有其他方法可以实现我的这个愿望?感谢您提供任何见解,
-迈克
【问题讨论】:
标签: c# c#-4.0 overloading optional-parameters overload-resolution