public abstract class NonGenericBase { public abstract int this[int i] { get; } } public abstract class GenericBase : NonGenericBase where T : GenericBase { T Instance { get { return default (T); } } public void Foo () { int i = Instance[10]; } } public class EntryPoint { public static void Main () { } }