.ctor是不明确的,因为类中存在多个具有此名称的成员

我正在复制我所面临的情况。

假设我们有一个程序集,C#类为:

public class Program { int n = 0; public void Print() { Console.WriteLine(n); } public Program() { } public Program(int num = 10) { n = num; } } 

我们在VB.NET项目中引用上面的程序集并尝试创建Program类的实例:

 Module Module1 Sub Main() Dim p As New Program() p.Print() p = New Program(20) p.Print() Console.ReadLine() End Sub End Module 

VB.NET项目没有编译,给出错误:

‘.ctor’含糊不清,因为“ConsoleApplication2.Program”类中存在多种具有此名称的成员。

从错误消息我们可以看到VB.NET编译器不确定要调用哪个构造函数 – 因为一个构造函数是无参数的,而另一个构造函数具有一个可选参数。 此问题发生在VS2010 / .NET 4中,而不是VS2012 / .NET 4.5中。 同样在C#中它没有任何问题,它成功编译并运行Program类的对象初始化代码。

有没有办法在不更改构造函数的情况下在VB.NET + VS2010 / .NET 4中创建Program类的实例?

问题在于Program类中构造函数的定义

因为第二个参数是可选的,所以在使用New Program()调用时它们都是候选者。 这造成了歧义。

相反,使用这种模式定义构造函数:

 public Program() : this(10) { } public Program(int num) { n = num; } 

或者只是单个构造函数:

 public Program(int num = 10) { n = num; } 

(我个人更喜欢第一个)。

最好的方法是改变构造函数的实现,就像@JonEgerton所写的那样。 如果这是不可能的,你可以尝试以下 – 不是很漂亮 – 解决方法:

  • 如果您知道Program类的内部实现,则可以在示例Dim p As New Program(0)使用int-Parameter调用带有无参数构造函数赋值的int-Parameter的构造函数。 这意味着您需要注意后续更改Program类的构造函数的实现,因为它们不会反映在您的实现中。 例如,如果Program类的实现者更改了无参数构造函数中指定的值,则您的解决方案仍将指定值0。
  • 由于C#似乎以不同方式处理创建,您还可以添加一个C#类(例如,在C#类库中),为您创建程序实例并将其返回给您的代码。 虽然这可能意味着为了这个唯一的目的而为您的解决方案添加一个类库,因此并不是一个非常好的方法,稍后Program类的实现的更改也将反映在您的程序中。