Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用类型约束实现泛型类时出错_C#_.net_Oop_C# 4.0 - Fatal编程技术网

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
继承?