That's not even the worst part, iago. They had to overload the new operator to do it!
Wait, what? You can't overload the new operator! It's not supported! New operator only exists to invoke the constructor!
Eww @ how the "new" operator has been redefined. Now it can allocate on the stack or the heap depending on the context. That feels icky. :-/ Now if you need to know how an object is allocated, you have to look up information about the object (whether it's a struct or class), and if it's the wrong one you're outta luck. Doesn't seem right...
How often do you need to know how an object is allocated?
In practice (and I have a lot of it), you rarely define structs. They have their purpose, but you know when you're using them what you're getting. They have an enormous speed advantage when it comes to allocation (if I recall my speed tests, a couple orders of magnitude), but they're limited in utility because they're passed by value, unless you explicitly pass them by reference (using ref or out), but then they might as well be classes.