【问题标题】:Generic class with matching generic parameters not valid base class具有匹配泛型参数的泛型类不是有效的基类
【发布时间】:2020-04-14 23:15:14
【问题描述】:

为什么在下面的示例中Base<BaseResult<bool, object>, bool, object> 不是Concrete<object> 的有效基类? Base<BaseResult<bool, object>, bool, object>SpecializedBase<bool, object> 的基础,SpecializedBase<bool, object> 似乎是 Concrete<object> 的合适基础?

public abstract class Base<TResult, TOutcome, TOutput>
        where TResult : BaseResult<TOutcome, TOutput>
        where TOutput : class
    {
    }

    public class BaseResult<TOutcome, TOutput>
    {
    }

    public abstract class SpecializedBase<TResult, TOutput> :
        Base<SpecializedResult<TOutput>, bool, TOutput>
        where TOutput : class
    {
    }

    public class SpecializedResult<TOutput> : BaseResult<bool, TOutput>
    {
    }

    public class Concrete<TOutput> : 
        SpecializedBase<SpecializedResult<TOutput>, TOutput>
        where TOutput : class
    {
    }

    static class Program {
        static void main()
        {
            // #1: works
            SpecializedBase<SpecializedResult<object>, object> obj;

            obj = new Concrete<object>();

            // #2: works
            Base<SpecializedResult<object>, bool, object> obj2;

            obj2 = new Concrete<object>();

            // #3: doesn't work:
            // Cannot implicitly convert type 'TypeTest.Concrete<object>' to 'TypeTest.Base<TypeTest.BaseResult<bool, object>, bool, object>'
            Base<BaseResult<bool, object>, bool, object> obj3;

            obj3 = new Concrete<object>();
        }
    }
}

【问题讨论】:

    标签: c# generics inheritance polymorphism


    【解决方案1】:

    让我们尝试逐步解析类型。

    Concrete&lt;object&gt; SpecializedBase&lt;SpecializedResult&lt;object&gt;, object&gt;SpecializedBase&lt;SpecializedResult&lt;object&gt;, object&gt; Base&lt;SpecializedResult&lt;object&gt;, bool, object&gt;.

    就是这样。 Base 直接继承自 Object,因此最终派生最少的类型是 Base&lt;TResult, TOutcome, TOutput&gt;,其中 TResult 设置为 SpecializedResult&lt;object&gt;TOutcome 设置为 boolTOutput 设置为 object。这种类型是不变的,因此Base&lt;SpecializedResult&lt;object&gt;, bool, object&gt; 不是 Base&lt;BaseResult&lt;bool, object&gt;, bool, object&gt;

    您可以在in the MSDN docsthis SO questionthis SO question 找到更多关于泛型方差的信息(可能还有其他一千个地方,这是一个众所周知的复杂概念)。

    【讨论】:

      猜你喜欢
      • 2020-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多