Lo que es realmente extraño es que el valor se pone para el parámetro opcional en la interfaz de realidad hace la diferencia. Supongo que debe preguntarse si el valor es un detalle de interfaz o un detalle de implementación. Hubiera dicho esto último, pero las cosas se comportan como la primera. El siguiente código muestra 1 0 2 5 3 7 por ejemplo.
// Output:
// 1 0
// 2 5
// 3 7
namespace ScrapCSConsole
{
using System;
interface IMyTest
{
void MyTestMethod(int notOptional, int optional = 5);
}
interface IMyOtherTest
{
void MyTestMethod(int notOptional, int optional = 7);
}
class MyTest : IMyTest, IMyOtherTest
{
public void MyTestMethod(int notOptional, int optional = 0)
{
Console.WriteLine(string.Format("{0} {1}", notOptional, optional));
}
}
class Program
{
static void Main(string[] args)
{
MyTest myTest1 = new MyTest();
myTest1.MyTestMethod(1);
IMyTest myTest2 = myTest1;
myTest2.MyTestMethod(2);
IMyOtherTest myTest3 = myTest1;
myTest3.MyTestMethod(3);
}
}
}
Lo que es bastante interesante es que si su interfaz hace que un parámetro opcional de la clase que implementa que no tiene que hacer lo mismo:
// Optput:
// 2 5
namespace ScrapCSConsole
{
using System;
interface IMyTest
{
void MyTestMethod(int notOptional, int optional = 5);
}
class MyTest : IMyTest
{
public void MyTestMethod(int notOptional, int optional)
{
Console.WriteLine(string.Format("{0} {1}", notOptional, optional));
}
}
class Program
{
static void Main(string[] args)
{
MyTest myTest1 = new MyTest();
// The following line won't compile as it does not pass a required
// parameter.
//myTest1.MyTestMethod(1);
IMyTest myTest2 = myTest1;
myTest2.MyTestMethod(2);
}
}
}
Lo que parece ser un error, sin embargo, es que si Implementa la interfaz explícitamente, el valor que das en la clase para el valor opcional no tiene sentido. ¿Cómo en el siguiente ejemplo podrías usar el valor 9? Esto ni siquiera da una advertencia al compilar.
// Optput:
// 2 5
namespace ScrapCSConsole
{
using System;
interface IMyTest
{
void MyTestMethod(int notOptional, int optional = 5);
}
class MyTest : IMyTest
{
void IMyTest.MyTestMethod(int notOptional, int optional = 9)
{
Console.WriteLine(string.Format("{0} {1}", notOptional, optional));
}
}
class Program
{
static void Main(string[] args)
{
MyTest myTest1 = new MyTest();
// The following line won't compile as MyTest method is not available
// without first casting to IMyTest
//myTest1.MyTestMethod(1);
IMyTest myTest2 = new MyTest();
myTest2.MyTestMethod(2);
}
}
}
Los comentarios de Martin a continuación dan un ejemplo detallado de las diversas dificultades, y me gustaría que el compilador marque los argumentos por defecto que no coincidan. Dicho esto, estoy usando esto en mi código porque indica mi intención como desarrollador tanto en la interfaz como en el nivel de implementación para que otros desarrolladores lo puedan ver. –
Preguntas interesantes relacionadas, "[¿Hay alguna razón para declarar parámetros opcionales en una interfaz?] (Https: // stackoverflow.com/questions/6752762 /) ", y," [¿Por qué los parámetros opcionales C# 4 definidos en la interfaz no se aplican en la implementación de clase?] (https://stackoverflow.com/questions/4922714/) ", el segundo con un interesante [respuesta de Lippert] (https://stackoverflow.com/a/4923642/1028230). – ruffin