Estaba jugando con parámetros opcionales para ver cómo funcionarían con las interfaces y me encontré con una advertencia extraña. La configuración que tenía era el siguiente código:Advertencia al implementar explícitamente una interfaz con parámetros opcionales
public interface ITestInterface
{
void TestOptional(int a = 5, int b = 10, object c = null);
}
public class TestClass : ITestInterface
{
void ITestInterface.TestOptional(int a = 5, int b = 5, object c = null)
{
Console.Write("a=" + a + " b=" + b + " c=" + c);
}
}
El compilador me da las siguientes advertencias:
- El valor predeterminado especificado para el parámetro 'a' no tendrá ningún efecto porque se aplica a un miembro que se utiliza en contextos que no permiten argumentos opcionales
- El valor predeterminado especificado para el parámetro 'b' no tendrá efecto porque se aplica a un miembro que se utiliza en contextos que no admiten argumentos opcionales
- El valor predeterminado especificado F o parámetro 'c' no tendrá ningún efecto porque se aplica a un miembro que se utiliza en contextos que no permiten argumentos opcionales
Si funciono esto con el siguiente código:
class Program
{
static void Main(string[] args)
{
ITestInterface test = new TestClass();
test.TestOptional();
Console.ReadLine();
}
}
consigo la salida de "" como era de esperar.
Mi pregunta es para qué sirve la advertencia. ¿A qué contextos se está refiriendo?
@GregC Sí, no tienen ningún efecto en caso de una implementación explícita. En el caso de una implementación implícita, lo importante es mantener los mismos valores en la interfaz y en las clases. De lo contrario, puede terminar con algunos errores muy difíciles de descubrir. –
También fueron bastante difíciles de descubrir en C++, por lo que el equipo de C# optó por esperar con valores de parámetros predeterminados hasta hace poco. Creo que vi esto en el blog de Eric L., creo. – GregC