public static void Main()
var test1 = (CanOnlyBeValueType<MyValueType>)new MyValueType();
var test2 = (CanOnlyBeValueType<MyReferenceType>)new MyReferenceType();
var test3 = (CanOnlyBeReferenceType<MyValueType>)new MyValueType();
var test4 = (CanOnlyBeReferenceType<MyReferenceType>)new MyReferenceType();
public interface CanOnlyBeValueType<T> where T : struct
public interface CanOnlyBeReferenceType<T> where T : class
public struct MyValueType : CanOnlyBeValueType<MyValueType>
public class MyReferenceType