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>();
}
}
}