【问题标题】:Error implementing Generic Class with Type Constraints使用类型约束实现泛型类时出错
【发布时间】:2012-06-29 10:02:48
【问题描述】:

我有一个通用基类,我想允许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”的隐式引用转换。

【问题讨论】:

  • 逗号不是,而是

标签: c# .net oop c#-4.0


【解决方案1】:

你没有满足你指定的约束。 T 必须扩展/实现 both ITest IBoldFace

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

更多信息请参见MSDN on generic constraints

【讨论】:

  • 我受够了你“我会比你快 10 秒回答这个问题”的态度。 :D
【解决方案2】:

根据您自己的通用约束,只有那些同时实现ITestIBoldface 的类型才适合您的BaseTestingCollection 类的通用参数。

不是非此即彼,怎么可能?当你从 T 上的 ITest 接口调用方法 Bar 时会发生什么,它只实现了 IBoldFace,而后者又没有定义方法 Bar?面对这种情况,编译器该怎么办?

没有可采取的合理措施。您的约束同时适用于泛型参数。

【讨论】:

    【解决方案3】:

    这种非此即彼的限制是无法实现的(我相信您已经注意到,逗号更像&amp;&amp; 而不是||)。您可以创建两个具有不同名称的不同抽象类(一个BaseTestingCollectionsTest&lt;T&gt; where T : ITest,另一个BaseTestingCollectionsBoldface&lt;T&gt; 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();
        }
    }
    

    【讨论】:

      【解决方案4】:

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

      interface ITestOrBold {}
      interface ITest : ITestOrBold {}
      interface IBoldface : ITestOrBold {}
      
      class BaseTestingCollections<T> where T : ITestOrBold {}
      

      显然你应该有一些合理的抽象而不是ITestOrBold

      【讨论】:

      • 不应该IBoldface继承自ITestOrBold吗?
      猜你喜欢
      • 1970-01-01
      • 2017-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多