En lenguajes como C++, un valor por defecto puede ser incluido como parte de la declaración de método:
Proceso de vacío (Empleado empleado, bool bonus = falso)
Este método se puede llamar con:
a.Process (employee, true);
o
a.Proceso (empleado);
en el segundo caso, la bonificación del parámetro se establece en falsa.
C# no tiene esta característica.
Una razón por la que no tenemos esta función está relacionada con una implementación específica de la función. En el mundo de C++, cuando el usuario escribe:
a.Proceso (empleado);
el compilador genera
a.process (empleado, false);
En otras palabras, el compilador toma el valor predeterminado que se especifica en el prototipo del método y lo coloca en la llamada al método; es como si el usuario hubiera escrito 'falso' como el segundo parámetro. No hay forma de cambiar ese valor predeterminado sin obligar al usuario de la clase a recompilar, lo cual es desafortunado.
El modelo de sobrecarga funciona mejor a este respecto. El autor del marco simplemente define dos métodos separados, y el de un solo parámetro llama al método de dos parámetros. Esto mantiene el valor predeterminado en el marco, donde se puede modificar si es necesario.
Sería posible para un compilador tomar algo como la definición de C++ y producir las sobrecargas, pero hay algunos problemas con ese enfoque.
El primero es que la correlación entre el código que el usuario escribe y el código que genera el compilador es menos obvio. Por lo general, tratamos de limitar la magia cuando es posible, ya que hace que sea más difícil para los programadores. El segundo problema tiene que ver con cosas como XML doc comments e intellisense. El compilador debería tener reglas especiales sobre cómo generar comentarios de documentación para los métodos sobrecargados, y intellisense debería tener inteligencia para colapsar los métodos sobrecargados en un único método.
Escribir sobrecargas es un poco menos conveniente, pero creemos que es una solución aceptable.
¿No ha cambiado en C# 4.0? Parece que ahora puede usar argumentos con nombre con valores predeterminados. Ver http://msdn.microsoft.com/en-us/library/dd264739.aspx La mayoría de las respuestas (desde 2008) parecen obsoletas y ahora son incorrectas. – Keyo
Sí, ahora está disponible para C#. –