如何在C#Generics中正确使用多个限制?

时间:2010-03-12 09:25:52

标签: c# generics

我试图将c#generics绑定到类和这样的接口:

public class WizardPage<T> where T : UserControl, IWizardControl 
{
    private T page;

    public WizardPage( T page ) {
        this.page = page;
    }
}

并使用它:

public class MyControl : UserControl, IWizardControl {
   //...
}

不知何故,C#似乎无法确定MyControl是否是T的正确实例

public class Wizard<T> where T : UserControl, IWizardControl {

    private WizardPage<T> Page1;

    public Wizard( MyControl control ) {
        this.Page1 = new WizardPage(control);
    }
}

失败并显示错误

  

'Controls.WizardPage&lt; T&gt; .WizardPage(T)'的最佳重载方法匹配   有一些无效的论点

我做错了什么或者这不起作用?

3 个答案:

答案 0 :(得分:2)

您的Wizard课程应该看起来像这样:

public class Wizard<T> where T : UserControl, IWizardControl
{
    private WizardPage<T> Page1;

    public Wizard(T control)
    {
        this.Page1 = new WizardPage<T>(control);
    }
}

或者,如果你不需要类本身是通用的,你可以做这样的事情:

public class Wizard
{
    private WizardPage<MyControl> Page1;

    public Wizard(MyControl control)
    {
        this.Page1 = new WizardPage<MyControl>(control);
    }
}

答案 1 :(得分:0)

我没有获得Wizard课程。不应该是这样的事情:

public class MyWizard : WizardPage<MyControl>{ 
    public MyWizard( MyControl control ) : base(control) { } 
} 

答案 2 :(得分:0)

你必须申报使用的类型:

this.Page1 = new WizardPage<MyControl>(control);