Come indicato nella documentazione per quel costruttore:
Stavi semplicemente chiamando un costruttore diverso da quello che pensavi nel tuo caso.
Il motivo è che C# consente un implicito conversione dal valore letterale intero 0 per enumerare i tipi (che sono solo tipi integrali sottostanti), e questa conversione implicita provoca il (string, SqlDbType) costruttore per essere una corrispondenza migliore per la risoluzione dell'overload rispetto alla conversione boxing necessaria per convertire int a object per il (string, object) costruttore.
Questo non sarà mai un problema quando passi un int variabile , anche se il valore di quella variabile è 0 (perché non è un valore letterale zero) o qualsiasi altra espressione che abbia il tipo int . Inoltre, non accadrà se trasmetti esplicitamente int a object come visto sopra, perché allora c'è solo un sovraccarico corrispondente.