Если бы int было свойством объекта, это сработало бы (потому что обе ссылки указывали бы на один и тот же объект в куче).
Int (даже как объект) неизменяем (как строка), поэтому с «a = 5» вы просто создаете новый объект и стираете ссылку на ваш параметр. (Но в коде вызова все еще есть предыдущая ссылка).
Вы можете делать все, что хотите, с ключевым словом ref:
public static void FunnyMethod(ref object a)
{ a = 5; }
public static void NotSoFunnyMethod(int a)
{ a = 5; }
public static void Main(string[] args)
{
int number = 10;
object obj = number;
FunnyMethod(ref obj);
Console.WriteLine(obj);
NotSoFunnyMethod((int)obj);
Console.WriteLine(obj);
}