2011-07-18 152 views
4
public T CreateForm<T>() where T: BaseForm, BaseMainForm 

我知道上面的方法,其中T是BaseForm一个BaseMainForm。但是,是否也可以使T必须是BaseForm a BaseMainForm泛型类型约束上还是

回答

5

不,这在C#中是不允许的。编译器使用通用约束来确定在通用方法内的T上有哪些操作 - 因此允许表达式不是类型安全的。

如果您需要此操作,请考虑添加一个涵盖公共部分BaseFormBaseMainForm的接口,并将其应用为通用约束。这样,接口定义了方法CreateForm<T>需要的合约 - 并且您必须确保您传递的表单实现接口。

喜欢的东西:

public interface IBaseForm 
{ 
    Foo(); 
} 

class BaseForm : IBaseForm {} 
class BaseMainForm : IBaseForm {} 

public T CreateForm<T>() where T : IBaseForm 
+0

清除和快速的答案!感谢名单! –

+0

如果你不控制BaseForm或BaseMainForm,它会变得更加困难,所以不能让它们实现接口。 –

0

这是不可能的。

考虑添加一个接口或基类,让这两个类都实现它,并将其用作类型约束。

0

不,你将需要提取的属性,那就是的CreateForm感兴趣的,基本形式和BaseMainForm到一个新的接口,它们都继承,然后你的方法引用接口