This is a typical implementation of the CRTP technique that came from C ++. Why is this correct? And why, actually, no? After all, we do not create any cyclic dependencies, we simply specify ourselves as a generalized parameter. But note, we point ourselves not to ourselves, but to another class, even if it is a parent. Not to say that I know how it is used in C #, but in C ++ it is a very common practice. If interested, you can read my article on CRTP in C ++ , and also I found a short article on the use of CRTP in C # at Habrahabr.