2

我在 c# 中有一个具有以下方法的类:

public MyRetType MyMethod(String p1 = null)
 {
    MyMethod(<default values>);
 } 
public MyRetType MyMethod(String p1, String p2, MyClass1 p3, String p4 = null, MyClass2 p5 = null)
 {
    ...
 } 

我不得不添加一个新的可选参数。为了保持向后兼容性,我添加了几个方法,每个方法多了一个参数,并且我重写了以前的方法来调用新的方法:

 public MyRetType MyMethod(String p1 = null, IEnumerable<int> pnew = null)
 {
    MyMethod(<default values>);
 } 
 public MyRetType MyMethod(String p1) 
 {
     return MyMethod(p1, null); 
 }

 public MyRetType Launch(String p1, String p2, MyClass1 p3, IEnumerable<int> pnew , String p4 = null, MyClass2 p5 = null)
 {
    ...
 } 
 public MyRetType MyMethod(String p1, String p2, MyClass1 p3, String p4= null, MyClass2 p5 = null)
 {
     return MyMethod(p1, p2, p3, null, p4, p5);
 }

这似乎在 c# 中有效,尽管我知道仅使用 null 调用 MyMethod 将是模棱两可的(它可能是最后一个清单中的两个第一个方法中的任何一个)。

但是,当尝试从 Visual Basic 调用 MyMethod 时,它不会在智能感知中列出。如果我手动编写它,我会收到一个错误:“Ambiguous call”。

为什么会这样?

4

1 回答 1

2

您需要放弃可选项并坚持使用重载 - 如果您已经获得了没有可选参数的重载,则可选项的意义会降低:

public MyRetType MyMethod() 
{
    return MyMethod(null,null);
}

public MyRetType MyMethod(String p1) 
{
    return MyMethod(p1,null);
}

public MyRetType MyMethod(String p1, IEnumerable<int>)
{
    MyMethod(<default values>);
} 
于 2013-02-22T11:58:46.610 回答