Implementing type parameterization in Java was a much simpler task than implementing it in a language like C++ and Ada because, in Java, all objects are allocated on the heap. Explain why allocating objects on the stack complicates the implementation of parameterized types. What about C#? Do some investigation and explore whether C# requires that all objects be allocated from the heap and how it approaches type parameterization.