As a C++ programmer, the first time I had to write some complex generic code in C# I was annoyed that a common C++ pattern of macros+templates for registration of factory functions wasn't directly expressible in C#. My recollection is fuzzy, but I hit exactly the inability to constraint new that you mention.
Then I found out about the ability to introspect and modify lambda expressions and generate code at startup time, which obviated the need for a template with constrained new, and I was blown away by that power.
I was also very pleasantly surprised that C# had very easy to use multiple dispatch.
So, C# is an extremely powerful, but you can't always port C++ idioms 1:1.
edit: and before you ask, yes, I'm a recovering complexity addict.
Then I found out about the ability to introspect and modify lambda expressions and generate code at startup time, which obviated the need for a template with constrained new, and I was blown away by that power.
I was also very pleasantly surprised that C# had very easy to use multiple dispatch.
So, C# is an extremely powerful, but you can't always port C++ idioms 1:1.
edit: and before you ask, yes, I'm a recovering complexity addict.