You can hide wider scopes in a lot of cases (but not as liberally as you can in some other C-style languages), and certainly can have a field and parameter of the same name (or a field and a local).
For one thing, if we didn't allow scope to hide wider scope, commonly used words would soon be banned by being in a wider scope.
For another, we can introduce something to a wider scope down the line, and even from another assembly. Say you didn't have int Test;
above. Now imagine than this is in a class that derives from another, and in that someone adds public int Test;
. What is meant to be done to deal with that.
It is certainly a good idea to avoid such name collisions, and conventions can help (lower-case start for locals, upper-case start for non-private members, underscore start for private has the advantage of complaining about the non-CLR compliant underscore if you temporarily make the private member public in an experiment and forget to set it back), but banning it outright would be unworkable.