使用Or的泛型类型约束

本文关键字:约束 泛型类型 Or 使用 | 更新日期: 2023-09-27 18:02:17

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

我知道上面的意思是T是一个BaseForm 一个BaseMainForm。但是,是否也有可能使T必须是BaseForm BaseMainForm的约束呢?

使用Or的泛型类型约束

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

如果需要,可以考虑添加一个接口,覆盖BaseFormBaseMainForm的公共部分,并将其应用为通用约束。这样,接口定义了方法CreateForm<T>需要的契约——你必须确保你传入的Form实现了这个接口。

类似:

public interface IBaseForm 
{
    Foo();
}
class BaseForm : IBaseForm {}
class BaseMainForm : IBaseForm {}
public T CreateForm<T>() where T : IBaseForm

这是不可能的。

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

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