There are several reasons. The code will work, but it is best practice to not reference the ObjectManager class directly.
- Because we say so! ;-) (better expressed as consistent code is good code)
- The code could by used with a different dependency injection framework in the future
- Testing is easier - you pass in mock arguments for the required class, without having to provide a mock ObjectManager
- It keeps dependencies clearer - it is obvious what the code depends on via constructor list, rather than having dependencies hidden in the middle of the code
- It encourages programmers to think about concepts like encapsulation and modularization better - if the constructor gets big, maybe it is a sign the code needs refactoring
I would also suggest reading up on dependency injection. There are lots of tutorials around on the concept. Here are a few I found pretty quickly, with Martin Fowler's description being definitely worth a read.
At the end of the day just remember dependency injection is not a new concept - Magento is following best practices learnt over more than 10 years by the community at large.