interface IFoo { } abstract class A { public T Value; } class B : A>, IFoo { public void Test () { IFoo foo = this; Value = this; } } class C : A.N>, IFoo { public void Test () { IFoo foo = this; Value = new N (); } public class N { } } class D : A> { public void Test () { Value = new D (); } } class E : IFoo where U : A> { public void Test (U u) { IFoo foo = u.Value; } } static class Application { public static int Main () { new B().Test (); new C().Test (); new D().Test (); return 0; } }