C#方法仅因可选参数而异

时间:2014-11-19 15:24:36

标签: c#

我找到了这个主题,但它是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);

编译器决定选择第一种方法,而不是给我一个错误。删除第一个方法后(它是未使用的代码),它开始调用第二个方法。

在某处可以选择将此视为错误吗?

3 个答案:

答案 0 :(得分:2)

如果您希望在编译时标记它,您将需要使用某种形式的第三方代码分析,因为C#语言规范将当前行为定义为应该发生的事情。

答案 1 :(得分:1)

根据specs

,这是每个设计
  

使用命名参数和可选参数会影响重载的解决方案   以下方式:

     
      
  • 方法,索引器或构造函数是执行的候选者,如果它的每个参数都是可选的或对应的,按名称或   按位置,调用语句中的单个参数,以及   参数可以转换为参数的类型。

  •   
  • 如果找到多个候选项,则首选转换的重载解析规则将应用于显式的参数   指定。忽略可选参数的省略参数。

  •   
  • 如果两个候选人被判断为同样好,那么优先选择的是没有可选参数的候选人   在通话中省略了。这是一般情况的结果   对于拥有较少的候选人,重载决议的偏好   参数。

  •   

所以,不 - 你不能。

答案 2 :(得分:1)

根据C# language guide强调我的),

  
    

使用命名和可选参数会以下列方式影响重载解析:

         

...

         

如果两个候选人被判断为同样好,那么优先选择的是没有可选参数的候选人,其中参数在调用中被省略。这是对具有较少参数的候选者的重载分辨率的一般偏好的结果。

  

您可以使用第三方分析工具将此标记为错误,或者使用Visual Studio内置的静态代码分析以及您实现的自定义规则。