【问题标题】:Why do I get an ambiguous call in vb but not in c#?为什么我在 vb 中得到一个模棱两可的调用,但在 c# 中却没有?
【发布时间】:2013-02-22 11:44:31
【问题描述】:

我在 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”。

为什么会这样?

【问题讨论】:

  • MyMethod(&lt;default values&gt;); 应该是什么?
  • 我希望你也能在 C# 中得到模棱两可的调用——你想要调用哪个重载:MyMethod("FooBar");
  • @DanielHilgarth:对大部分值设置为默认值的大型 MyMethod 的调用。我觉得没关系,反正问题肯定出在方法签名上。
  • @JonEgerton,对,没想到。不会发生,虽然'。
  • 那么,重载它以保持用户友好和向后兼容的“正确”方法应该是什么?

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


【解决方案1】:

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

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>);
} 

【讨论】:

  • 对此我非常感谢(以及 Dmitry 的回复),但他们没有回答这个问题:为什么?为什么它在 c# 中工作?为什么 vb 不允许我毫无歧义地使用重载?即 MyMethod(null, null) 只有一个有效的解释。
  • 我怀疑在某些时候你会发现它在 C# 中也不起作用。
  • 我打算等一会儿,以防有人出现更好的答案,完全忘记了这一点,所以我现在接受你的答案,对不起!。正如您所预测的,一些测试也使其在 C# 中失败。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-01
相关资源
最近更新 更多