Noté que con los parámetros opcionales en C # 4 si especifica un parámetro opcional en una interfaz que no tiene, debe hacer que ese parámetro sea opcional en cualquier clase de implementación:
public interface MyInterface
{
void TestMethod(bool flag = false);
}
public class MyClass : MyInterface
{
public void TestMethod(bool flag)
{
Console.WriteLine(flag);
}
}
y por lo tanto:
var obj = new MyClass();
obj.TestMethod(); // compiler error
var obj2 = new MyClass() as MyInterface;
obj2.TestMethod(); // prints false
¿Alguien sabe por qué los parámetros opcionales están diseñados para funcionar de esta manera?
Por un lado, supongo que la capacidad de anular cualquier valor predeterminado especificado en las interfaces es útil, aunque para ser honesto, no estoy seguro de si incluso debería poder especificar los valores predeterminados en la interfaz, ya que eso debería ser una decisión de implementación.
Por otro lado, esta desconexión significa que no siempre se puede usar la clase concreta y la interfaz de manera intercambiable. Esto, por supuesto, no sería un problema si el valor predeterminado se especifica en la implementación, pero si está exponiendo su clase concreta como la interfaz (usando un marco IOC para inyectar la clase concreta, por ejemplo), entonces realmente no hay punto tener el valor predeterminado ya que la persona que llama tendrá que proporcionarlo siempre de todos modos.
MyInterface
y llamarlo con el parámetro opcional: ((MyInterface)obj).TestMethod();
.