【问题标题】:How to avoid error "Constructor on type 'MyType' not found" when inheriting a base class继承基类时如何避免错误“找不到类型'MyType'的构造函数”
【发布时间】:2013-04-25 21:56:07
【问题描述】:

我有一个 Visual Studio 2010 Windows Forms 应用程序,其中包含一个其他类将继承的 Form 基类。基类的构造函数接受子类将传递给基类的参数。

例子:

public partial class BaseForm : Form
{
    public BaseForm(int number)
    {
        InitializeComponent();
    }
}

public partial class ChildForm : BaseForm
{
    public ChildForm(int number)
        : base(number)
    {
        InitializeComponent();
    }
}

我遇到的问题是,当我尝试在 VisualStudio 的设计视图模式下打开 ChildForm 时,我收到以下错误:

找不到类型“MyProject.BaseForm”的构造函数。

注意:不管报错,项目编译运行正常。

如果我用不包含任何参数的构造函数重载构造函数,我可以避免错误。

示例:(这消除了错误)

public partial class BaseForm : Form
{
    public BaseForm(int number)
    {
        InitializeComponent();
    }

    public BaseForm()
    {
        InitializeComponent();
    }
}

public partial class ChildForm : BaseForm
{
    public ChildForm(int number)
        : base(number)
    {
        InitializeComponent();
    }
}

我的问题是,如何创建不包含无参数构造函数的基类并避免设计视图错误?

【问题讨论】:

    标签: c# visual-studio-2010 inheritance windows-forms-designer base-class


    【解决方案1】:

    那是完全不可能的。

    您在设计视图中看到的表单是您的基类的实际实例。
    如果没有默认构造函数,则设计者无法创建该实例。

    您可以将构造函数标记为[Obsolete("Designer only", true)],并使其在不在设计器中调用时抛出异常,以防止其他人调用它。

    【讨论】:

    • 需要的无参实例构造函数可以是private吗?
    • @JeppeStigNielsen - 是的。这就是我最终做的事情,一切都很好。
    • 如果与继承的类不同,请确保编译基类所在的项目。
    【解决方案2】:

    您需要调整 BaseForm 输出类型,在项目的属性中,将输出类型从 Windows 应用程序更改为类库。

    参考: https://docs.microsoft.com/en-us/dotnet/framework/winforms/advanced/walkthrough-demonstrating-visual-inheritance

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-17
      • 1970-01-01
      • 1970-01-01
      • 2016-05-16
      • 1970-01-01
      相关资源
      最近更新 更多