VS Designer错误:GenericArguments [0],'Y'上的'X'违反了类型参数'Z'的约束

时间:2017-01-30 08:49:51

标签: c# visual-studio generics windows-forms-designer type-constraints

我正在尝试创建从“泛型”基类继承的表单,其中该基类的泛型参数具有必须实现其中一个接口的约束。

它编译并运行得很好。我的问题在于Visual Studio设计器。它将打开表单,直到我重建项目,然后在尝试查看表单设计器时报告下面的错误,直到我重新启动Visual Studio,或删除基类中的自定义接口约束。

GenericArguments[0], 'InterfaceInBaseClassProblem.TestEntity', on 'InterfaceInBaseClassProblem.BaseWindowClass`1[EntityType]' violates the constraint of type 'EntityType'.

第1步:创建界面

namespace InterfaceInBaseClassProblem
{
    public interface ITestInterface
    {
        void Func1();
    }
}

步骤2:创建一个实现接口的类

namespace InterfaceInBaseClassProblem
{
    public class TestEntity : ITestInterface
    {
        public void Func1()
        {
        }
    }
}

步骤3:创建一个通用基类Form,需要一个通用参数约束,要求实现我们创建的接口

using System.Windows.Forms;
namespace InterfaceInBaseClassProblem
{
    public class BaseWindowClass<EntityType> : Form where EntityType : ITestInterface
    {
    }
}

步骤4:现在创建一个继承自Generic Base Form的新表单,并使用TestEntity类作为参数

namespace InterfaceInBaseClassProblem
{
    public partial class Form1 : BaseWindowClass<TestEntity>
    {
        public Form1()
        {
            InitializeComponent();
        }
    }
}

步骤5:保存项目并测试我正在尝试解决的以下行为:

a) Close Visual Studio
b) Open Visual Studio
c) Open the Form1 class to view its designer and confirm its working
d) Close the Form1 designer you just opened
e) Rebuild the project
f) Open the Form1 class to view the error I have reported.
g) Either restart Visual Studio, or comment out the "where EntityType : ITestInterface" constraint we included with step 3 and rebuild to see it start working again

附加说明:

  • 我已经在VS2015和2017测试了相同的结果
  • 我已经在多台开发机器上进行了测试
  • 我对此设计的需求是在基类中以及它将执行的各种附加功能/角色,这些功能/角色需要通用的“EntityType”并要求它可以执行我添加到自定义界面的操作。这些泛型函数将被我声明从该基类继承的所有表单使用。

1 个答案:

答案 0 :(得分:2)

如果微软看到这一点,我会遇到类似的问题。在VS2015中确认。我有4种形式:

public class BaseForm : Form
{
    public BaseForm() {...}
}

public class BaseSubForm<T> : Form where T : BaseForm
{
    public SubForm(T f) {...}
    public InitForm(T f) {...}
}

public partial class TestForm : BaseForm
{
    TestSubForm sf;

    public TestForm()
    {
        ...
        sf = new TestSubForm(this);
    }
}

public partial class TestSubForm : BaseSubForm<TestForm>
{
    public TestSubForm(TestForm f) : base(f)
    {
        InitializeComponent();
    }
}

如果我构建它,它会运行,但TestSubForm不会在设计器中显示。但是,如果我从BaseSubForm的构造函数中删除参数......

...
public SubForm() {...}
...
sf = new TestSubForm();
...
public TestSubForm(TestForm f)
...

我可以重新启动Visual Studio,构建它,它会显示得很好。我可以在InitForm,我的第二阶段构造函数中传递该参数,但是它很烦人,我需要2个构造函数。

Designer似乎讨厌类型Subclass : BaseClass<Generic>

的类