You can always use CLR in a erased fashion. But then interop comes… That’s basically one of the biggest issues. How would you express List<T> and MutableList<T> with reified T in CLR, and then go deeper with use-site variance, while still having ability to pass Something<out T> as Something<T> to another library not having any idea about use-site variance?