Potrebbe essere una cattiva pratica, se non fosse per il fatto che è già abbastanza ovvio di cosa stai parlando nel tuo codice, in base al contesto.
Dog = new Dog();
Qual è il costruttore del tipo? Qual è l'oggetto? Non è confuso? OK, che ne dici di
Dog = Dog.Create()?
Qual è l'oggetto? Qual è il metodo statico di fabbrica sul tipo? Non sei ancora confuso? Non pensavo.
L'unica volta che ho visto questo è un potenziale problema è quando l'albero dei nomi diventa piuttosto elaborato, e il compilatore non riesce a capire l'ambiguità, nel qual caso si finisce con qualcosa di simile
Dog = new Some.Namespace.Dog();
In ogni caso, questo dovrebbe accadere solo con le Proprietà Automatiche (e forse le enumerazioni), poiché i nomi delle variabili locali sono sempre camelCased, evitando completamente l'ambiguità.
dog = new Dog();