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

标签 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 类的实例?

最佳答案

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

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

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

public Program()
    : this(10)
{
}

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

或者只是一个构造函数:

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

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

关于c# - .ctor 是不明确的,因为类中存在多种具有此名称的成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21904767/

相关文章:

c# - IIS MIME 类型的元数据库路径

.net - 用 mkbundle2 打包后,目标机器提示 libmono.so。为什么?

vb.net - 返回 Stringbuilder 内容

vb.net - 自定义 Generic.IEqualityComparer(Of T) - 编译器错误

asp.net - 为什么我的 GridView SelectedIndexChanged 事件没有触发?

c# - 在 Windows 7 中从托管代码调用非托管代码时发生内存泄漏

c# - cmd批处理监听控制台应用程序的输出

c# - 覆盖身份验证属性的用途是什么?

c# - 有没有什么办法可以聚焦(选项卡控件)图片框?

c# - 将 List<object> 转换为 AnonymousTypes 列表