使用类型约束实现泛型类时出错

时间:2012-06-27 21:44:40

标签: c# .net oop c#-4.0

我有一个通用基类,我想允许其中一种ITestIBoldface

My Base Class如下所示:

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

继承它的一个类看起来像这样:

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

编译时我收到此错误:

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

4 个答案:

答案 0 :(得分:4)

这样的任何一个/或限制都无法完成(因为我确定你已经注意到,逗号更像是&&而不是||)。您可以使用不同的名称创建两个不同的抽象类(一个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();
    }
}

答案 1 :(得分:3)

嗯,你并没有对你指定的约束感到不满意。 T必须扩展/实施 ITest IBoldFace

您的约束并不意味着它必须扩展/实现一个类型 - 它必须两个。类型参数必须满足所有类型约束才能生效。

有关详细信息,请参阅MSDN on generic constraints

答案 2 :(得分:3)

根据您自己的通用约束,只有那些实现 {/ em> ITestIBoldface的类型才是BaseTestingCollection类的合适通用参数。

它不是 - 或者,它怎么可能?如果您从Bar上的ITest界面调用方法T会发生什么,该IBoldFace界面只会实现Bar,后者又不会定义方法{{1}}?面对这样的场景时,编译器要做什么?

没有合理的行动。您的约束同时适用于泛型参数。

答案 3 :(得分:2)

你不能用C#泛型表达这样的“或者 - 或”约束。使用某种公共基础接口:

interface ITestOrBold {}
interface ITest : ITestOrBold {}
interface IBoldface : ITestOrBold {}

class BaseTestingCollections<T> where T : ITestOrBold {}

显然,你应该有一些明智的抽象而不是ITestOrBold