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();
.Respuestas:
ACTUALIZACIÓN: Esta pregunta fue el tema de mi blog el 12 de mayo de 2011. ¡Gracias por la gran pregunta!
Suponga que tiene una interfaz como la describe y cien clases que la implementan. Luego decide hacer que uno de los parámetros de uno de los métodos de la interfaz sea opcional. ¿Está sugiriendo que lo correcto es que el compilador obligue al desarrollador a encontrar todas las implementaciones de ese método de interfaz y que el parámetro también sea opcional?
Supongamos que hicimos eso. Ahora suponga que el desarrollador no tiene el código fuente para la implementación:
¿Cómo se supone que el autor de D hará que esto funcione? ¿Están obligados en su mundo a llamar al autor de B por teléfono y pedirles que les envíen una nueva versión de B que haga que el método tenga un parámetro opcional?
Eso no va a volar. ¿Qué pasa si dos personas llaman al autor de B, y una de ellas quiere que el valor predeterminado sea verdadero y una de ellas quiere que sea falso? ¿Qué pasa si el autor de B simplemente se niega a seguir el juego?
Quizás en ese caso se les exigiría decir:
La característica propuesta parece agregar muchos inconvenientes para el programador sin un aumento correspondiente en el poder representativo. ¿Cuál es el beneficio convincente de esta función que justifica el mayor costo para el usuario?
ACTUALIZACIÓN: en los comentarios a continuación, supercat sugiere una función de lenguaje que realmente agregaría poder al lenguaje y permitiría algunos escenarios similares al descrito en esta pregunta. Para su información, esa característica, implementaciones predeterminadas de métodos en interfaces, se agregará a C # 8.
fuente
Un parámetro opcional se etiqueta con un atributo. Este atributo le dice al compilador que inserte el valor predeterminado para ese parámetro en el sitio de la llamada.
La llamada
obj2.TestMethod();
se reemplaza porobj2.TestMethod(false);
cuando el código C # se compila a IL, y no en el momento JIT.Entonces, en cierto modo, siempre es la persona que llama proporcionando el valor predeterminado con parámetros opcionales. Esto también tiene consecuencias en el control de versiones binarias: si cambia el valor predeterminado pero no vuelve a compilar el código de llamada, continuará utilizando el valor predeterminado anterior.
Ya no puede hacerlo si el método de interfaz se implementó explícitamente .
fuente
Debido a que los parámetros predeterminados se resuelven en tiempo de compilación, no en tiempo de ejecución. Por lo tanto, los valores predeterminados no pertenecen al objeto al que se llama, sino al tipo de referencia por el que se llama.
fuente
Los parámetros opcionales son como una macro sustitución de lo que entiendo. No son realmente opcionales desde el punto de vista del método. Un artefacto de eso es el comportamiento que ve cuando obtiene resultados diferentes si lanza a una interfaz.
fuente