我有一个通用基类,我想允许其中一种ITest
或IBoldface
。
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”的隐式引用转换。
答案 0 :(得分:4)
这样的任何一个/或限制都无法完成(因为我确定你已经注意到,逗号更像是&&
而不是||
)。您可以使用不同的名称创建两个不同的抽象类(一个BaseTestingCollectionsTest<T> where T : ITest
,另一个BaseTestingCollectionsBoldface<T> where T : IBoldface
),或者删除静态限制并在运行时进行检查。或者让ITest
或IBoldface
中的一个扩展另一个,或扩展一个公共接口,如果他们共享成员。
以下是运行时检查的示例:
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> ITest
和IBoldface
的类型才是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
。