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

时间:2014-02-20 10:19:36

标签: c# .net vb.net constructor ambiguity

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

假设我们有一个程序集,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类'实例?

2 个答案:

答案 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写道。如果这是不可能的,你可以尝试以下 - 不是很漂亮 - 解决方法:

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