1

我有一个通用基类,我想允许两种类型中的一种ITestIBoldface.

我的基类如下所示:

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

4 回答 4

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();
    }
}
于 2012-06-27T21:49:01.713 回答
3

那么你不满足你指定的约束。T必须同时扩展/实现ITest IBoldFace

您的约束并不意味着它必须扩展/实现其中一种类型 - 它必须同时执行。类型参数必须满足所有类型约束才能有效。

有关更多信息,请参阅有关通用约束的 MSDN。

于 2012-06-27T21:47:58.760 回答
3

根据您自己的通用约束,只有那些实现了这两者 ITest并且IBoldface适合您的BaseTestingCollection类的通用参数的类型。

不是非此即彼——或者,它怎么可能呢?当您Bar从只实现的ITest接口调用方法时会发生什么,而后者又不定义任何方法?面对这种情况,编译器该怎么办? TIBoldFaceBar

没有合理的行动可以采取。您的约束同时适用于通用参数。

于 2012-06-27T21:48:14.553 回答
2

您不能使用 C# 泛型表达这样的“非此即彼”约束。使用某种通用的基本接口:

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

class BaseTestingCollections<T> where T : ITestOrBold {}

ITestOrBold显然,您应该有一些明智的抽象来代替。

于 2012-06-27T21:49:58.850 回答