C# 使用类型约束实现泛型类时出错
我有一个泛型基类,我想允许两种类型之一C# 使用类型约束实现泛型类时出错,c#,.net,oop,c#-4.0,C#,.net,Oop,C# 4.0,我有一个泛型基类,我想允许两种类型之一ITest或IBoldface 我的基类如下所示: public abstract class BaseTestingCollections<T> where T : ITest, IBoldface { ... } public class TestCollection : BaseTestingCollections<ITest>, ITestCollection { ... } 公共抽象类BaseTestingCollect
ITest
或IBoldface
我的基类如下所示:
public abstract class BaseTestingCollections<T> where T : ITest, IBoldface
{
...
}
public class TestCollection : BaseTestingCollections<ITest>, ITestCollection
{
...
}
公共抽象类BaseTestingCollections,其中T:ITest,IBoldface
{
...
}
继承它的类之一如下所示:
public abstract class BaseTestingCollections<T> where T : ITest, IBoldface
{
...
}
public class TestCollection : BaseTestingCollections<ITest>, ITestCollection
{
...
}
public类TestCollection:basetestingcollection、ITestCollection
{
...
}
编译时,会出现以下错误:
类型DomainLogic.ITest不能用作泛型类型或方法“DomainLogic.BaseTestingCollections”中的类型参数“T”。没有从“DomainLogic.ITest”到“DomainLogic.IBoldface”的隐式引用转换 您没有满足指定的约束条件
T
必须扩展/实现ITest
和IBoldFace
您的约束并不意味着它必须扩展/实现其中一种类型——它必须同时执行这两种操作。类型参数必须满足所有类型约束才能有效
有关详细信息,请参阅。您没有满足指定的约束条件
T
必须扩展/实现ITest
和IBoldFace
您的约束并不意味着它必须扩展/实现其中一种类型——它必须同时执行这两种操作。类型参数必须满足所有类型约束才能有效
有关更多信息,请参见。根据您自己的泛型约束,只有那些同时实现了
ITest
和IBoldface
的类型才适合于BaseTestingCollection
类的泛型参数
不是非此即彼,怎么可能呢?当您从T
上的ITest
接口调用方法Bar
时会发生什么情况,该接口仅实现IBoldFace
,而IBoldFace又不定义任何方法Bar
?面对这种情况,编译器应该怎么做
没有合理的行动可采取。您的约束将所有约束同时应用于泛型参数。根据您自己的泛型约束,只有同时实现了
ITest
和IBoldface
的类型才适合BaseTestingCollection
类的泛型参数
不是非此即彼,怎么可能呢?当您从T
上的ITest
接口调用方法Bar
时会发生什么情况,该接口仅实现IBoldFace
,而IBoldFace又不定义任何方法Bar
?面对这种情况,编译器应该怎么做
没有合理的行动可采取。您的约束同时应用于泛型参数。这样的非此即彼的约束是无法实现的(我相信您已经注意到,逗号更像是
&&
而不是|
)。您可以使用不同的名称创建两个不同的抽象类(一个是basetestingcollectiontest,其中T:ITest
,另一个是BaseTestingCollectionsBoldface,其中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();
}
}
公共抽象类BaseTestingCollections
{
公共BaseTestingCollections()
{
如果(!typeof(ITest).IsAssignableFrom(typeof(T))&&&!typeof(IBoldface).IsAssignableFrom(typeof(T)))
抛出新异常();
}
}
这样的非此即彼的限制是无法实现的(我相信您已经注意到,逗号更像是&&
而不是|
)。您可以使用不同的名称创建两个不同的抽象类(一个是basetestingcollectiontest,其中T:ITest
,另一个是BaseTestingCollectionsBoldface,其中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();
}
}
公共抽象类BaseTestingCollections
{
公共BaseTestingCollections()
{
如果(!typeof(ITest).IsAssignableFrom(typeof(T))&&&!typeof(IBoldface).IsAssignableFrom(typeof(T)))
抛出新异常();
}
}
不能用C#泛型表达这样的“非此即彼”约束。使用某种类型的公共基本接口:
interface ITestOrBold {}
interface ITest : ITestOrBold {}
interface IBoldface : ITestOrBold {}
class BaseTestingCollections<T> where T : ITestOrBold {}
interface ITestOrBold{}
接口ITest:ITestOrBold{}
接口IBoldface:ITestOrBold{}
类BaseTestingCollections,其中T:ITestOrBold{}
显然,你应该有一些合理的抽象,而不是ITestOrBold
。你不能用C#泛型表达这样的“非此即彼”约束。使用某种类型的公共基本接口:
interface ITestOrBold {}
interface ITest : ITestOrBold {}
interface IBoldface : ITestOrBold {}
class BaseTestingCollections<T> where T : ITestOrBold {}
interface ITestOrBold{}
接口ITest:ITestOrBold{}
接口IBoldface:ITestOrBold{}
类BaseTestingCollections,其中T:ITestOrBold{}
显然,你应该有一些合理的抽象,而不是
ITestOrBold
。逗号不是or,而是and。逗号不是or,而是and。我受够了你那种“我要比你快10秒回答这个问题”的态度我受够了你那种“我要比你快10秒回答这个问题”的态度数据不应该IBoldface
从ITestOrBold
继承?不应该IBoldface
从ITestOrBold
继承?