Компилятор C # всегда будет пытаться выбрать метод, который наиболее близко соответствует аргументам. В вашем случае перегрузка foo(int, int)
точно соответствует вашим входным аргументам, тогда как перегрузка foo(params int)
является более слабым.
Вот вам хороший обзор перегрузки методов на C #, если вы заинтересованы: http://csharpindepth.com/Articles/General/Overloading.aspx