class BaseGeneric { public class InnerDerived { public InnerDerived (T t) { } } public class GenericInnerDerived { public GenericInnerDerived (T t, U u) { } } } class BaseConcrete : BaseGeneric { } class Concrete_A : BaseGeneric { } class Concrete_B : BaseConcrete { InnerDerived foo1; } class BaseGeneric_2 { public class InnerDerived { public InnerDerived (T t, U u) { } } } class BaseGeneric_1 : BaseGeneric_2 { } class Concrete_2 : BaseGeneric_1 { } class Program { public static void Main () { new Concrete_B.InnerDerived ("abc"); new Concrete_A.InnerDerived (11); new Concrete_A.GenericInnerDerived (1, 2); new Concrete_2.InnerDerived (false, "bb"); } }