我正在复制我所面临的情况。
假设我们有一个程序集,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类'实例?
答案 0 :(得分:8)
问题在于Program
类
因为第二个参数是可选的,所以当使用New Program()
进行调用时,两者都是候选者。这造成了歧义。
相反,使用这种模式定义构造函数:
public Program()
: this(10)
{
}
public Program(int num)
{
n = num;
}
或只是单个构造函数:
public Program(int num = 10)
{
n = num;
}
(我个人更喜欢第一种)。
答案 1 :(得分:0)
最好的方法是改变构造函数的实现,同样@JonEgerton写道。如果这是不可能的,你可以尝试以下 - 不是很漂亮 - 解决方法:
Dim p As New Program(0)
中使用int-Parameter调用带有无参数构造函数赋值的int-Parameter的构造函数。这意味着您需要注意Program
类构造函数实现的后续更改,因为它们不会反映在您的实现中。例如,如果Program
类的实现者更改了无参数构造函数中指定的值,则您的解决方案仍将指定值0。Program
类的实现更改也将反映在您的程序中。