You must also include the parent type to save the inherited type to Left and Right (otherwise you cannot use the inherited type in the implementation):
public abstract class BinaryNodeAbstract<T, L> where L : BinaryNodeAbstract<T, L> { public T Value; public L Left; public L Right; }
You can use it as follows:
public class BinaryNodeImplementation : BinaryNodeAbstract<int, BinaryNodeImplementation> { }
source share