我找到了这个主题,但它是VB ......并且它们收到错误: vb issue
以下是我的方法签名。请注意,其中一种返回类型不同。
public static bool PopulateRunWithSimpleValueByFieldIdSync(string fieldValue, string fieldId, IViewModel myself, int index)
VS
public static void PopulateRunWithSimpleValueByFieldIdSync(string fieldValue, string fieldId, IViewModel myself, int index = 0, PopulateDoneCallback populateDone = null)
我正在进行的实际通话:
PopulateRunWithSimpleValueByFieldIdSync(date, dtx.DateField, saver, index);
编译器决定选择第一种方法,而不是给我一个错误。删除第一个方法后(它是未使用的代码),它开始调用第二个方法。
在某处可以选择将此视为错误吗?
答案 0 :(得分:2)
如果您希望在编译时标记它,您将需要使用某种形式的第三方代码分析,因为C#语言规范将当前行为定义为应该发生的事情。
答案 1 :(得分:1)
根据specs
,这是每个设计使用命名参数和可选参数会影响重载的解决方案 以下方式:
方法,索引器或构造函数是执行的候选者,如果它的每个参数都是可选的或对应的,按名称或 按位置,调用语句中的单个参数,以及 参数可以转换为参数的类型。
如果找到多个候选项,则首选转换的重载解析规则将应用于显式的参数 指定。忽略可选参数的省略参数。
如果两个候选人被判断为同样好,那么优先选择的是没有可选参数的候选人 在通话中省略了。这是一般情况的结果 对于拥有较少的候选人,重载决议的偏好 参数。
所以,不 - 你不能。
答案 2 :(得分:1)
根据C# language guide(强调我的),
使用命名和可选参数会以下列方式影响重载解析:
...
如果两个候选人被判断为同样好,那么优先选择的是没有可选参数的候选人,其中参数在调用中被省略。这是对具有较少参数的候选者的重载分辨率的一般偏好的结果。
您可以使用第三方分析工具将此标记为错误,或者使用Visual Studio内置的静态代码分析以及您实现的自定义规则。