2012-06-27 39 views
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

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

那么你不satistfying您指定的约束。 T必须扩展/实现ITestIBoldFace

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

更多信息请参见MSDN on generic constraints

+2

我已经厌倦了你的“我要回答这个问题比你快10秒”的态度。 :D –

3

每自己的泛型约束,只有那些实现类型都ITestIBoldface是您BaseTestingCollection类适当的通用参数。

这不是非此即彼的,怎么会是谁?当你调用从ITest接口方法BarT只实现IBoldFace,这反过来又没有定义方法Bar会发生什么?面对这种情况时,编译器要做什么?

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

2

你不能表达与C#泛型的“非此即彼”的约束这样的。使用一个共同的基础界面某种:

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

class BaseTestingCollections<T> where T : ITestOrBold {} 

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

+0

不应该'IBoldface'继承自'ITestOrBold'吗? – hatchet

+0

@hatchet哎呀,谢谢你指出。 – millimoose