Or的泛型类型约束

时间:2011-07-18 08:27:18

标签: c# constraints generics

public T CreateForm<T>() where T: BaseForm, BaseMainForm

我知道以上意味着T是BaseForm a BaseMainForm。但是,是否也可以制定T必须是BaseForm a BaseMainForm的约束?

3 个答案:

答案 0 :(得分:5)

不,C#中不允许这样做。编译器使用泛型约束来确定泛型方法中T上可用的操作 - 因此允许表达式不是类型安全的。

如果您需要此功能,请考虑添加涵盖BaseFormBaseMainForm公共部分的界面,并将其应用为通用约束。这样,接口定义了方法CreateForm<T>所需内容的契约 - 您必须确保传入的Form实现接口。

类似的东西:

public interface IBaseForm 
{
    Foo();
}

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

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

答案 1 :(得分:0)

这是不可能的。

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

答案 2 :(得分:0)

不,您需要将BaseForm和BaseMainForm中的CreateForm感兴趣的属性提取到它们都继承的新接口中,然后您的方法将引用该接口