我有一个通用基类,我想允许两种类型ITestIBoldface之一。

我的基类如下所示:

public abstract class BaseTestingCollections<T> where T : ITest, IBoldface
{
...
}


继承它的类之一如下所示:

public class TestCollection : BaseTestingCollections<ITest>, ITestCollection
{
...
}


编译时出现此错误:

在通用类型或方法“ DomainLogic.BaseTestingCollections”中,类型DomainLogic.ITest'不能用作类型参数“ T”。没有从“ DomainLogic.ITest”到“ DomainLogic.IBoldface”的隐式引用转换。

最佳答案

这样的“或”或“限制”是不可能完成的(正如我确定您已经注意到的那样,逗号更像&&而不是||)。您可以使用不同的名称(一个BaseTestingCollectionsTest<T> where T : ITest,另一个BaseTestingCollectionsBoldface<T> where T : IBoldface)创建两个不同的抽象类,或者删除静态限制并将检查放在运行时。或使ITestIBoldface之一扩展另一个,或扩展公共接口(如果它们共享成员)。

这是在运行时检查的示例:

public abstract class BaseTestingCollections<T>
{
    public BaseTestingCollections()
    {
        if (!typeof(ITest).IsAssignableFrom(typeof(T)) && !typeof(IBoldface).IsAssignableFrom(typeof(T)))
            throw new Exception();
    }
}

10-07 12:50