为什么我在vb中得到一个模糊的调用而不是在c#中?

时间:2013-02-22 11:44:32

标签: c# .net vb.net visual-studio-2010 ambiguous-call

我在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会是ambiguos(它可能是上一个列表中的两个第一个方法中的任何一个)。

但是,当尝试从Visual Basic调用MyMethod时,它未在intellisense中列出。如果我手动编写,我收到一个错误:“不明确的电话”。

为什么会这样?

1 个答案:

答案 0 :(得分: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>);
}