The overloading tries to work out which method is "better". If it's a choice between string x and params string x the former will always win - but at this point it's effectively a choice between object x and params string x. (The fact that one is actually a generic method is only relevant in a tie-break situation.) For the purposes of working out "better conversions" the expanded form of the method with the params parameter is then used. This means that by the time actual conversions are considered, the choices are object x or string x - so clearly the latter wins.