Why is in the below example Base<BaseResult<bool, object>, bool, object> not a valid base class for Concrete<object>? Base<BaseResult<bool, object>, bool, object> is base to SpecializedBase<bool, object>, and SpecializedBase<bool, object> seems like a proper base for 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>();
        }
    }
}