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

Bri*_*rij 5 .net c# 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我们在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
Run Code Online (Sandbox Code Playgroud)

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

'.ctor'含糊不清,因为"ConsoleApplication2.Program"类中存在多种具有此名称的成员.

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

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

Jon*_*ton 8

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

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

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

public Program()
    : this(10)
{
}

public Program(int num)
{
    n = num;
}
Run Code Online (Sandbox Code Playgroud)

或者只是单个构造函数:

public Program(int num = 10)
{
    n = num;
}
Run Code Online (Sandbox Code Playgroud)

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