parametro parameter opcional definir c# .net c#-4.0 interface optional-parameters

parameter - definir parametro opcional c#



¿Por qué los parámetros opcionales de C#4 definidos en la interfaz no se aplican en la clase de implementación? (4)

ACTUALIZACIÓN: Esta pregunta fue el tema de mi blog el 12 de mayo de 2011. ¡Gracias por la gran pregunta!

Supongamos que tiene una interfaz como la describe y un centenar de clases que la implementan. Luego, decide 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 cada implementación de ese método de interfaz, y que también haga que el parámetro sea opcional?

Supongamos que hicimos eso. Ahora supongamos que el desarrollador no tenía el código fuente para la implementación:

// in metadata: public class B { public void TestMethod(bool b) {} }

// in source code interface MyInterface { void TestMethod(bool b = false); } class D : B, MyInterface {} // Legal because D''s base class has a public method // that implements the interface method

¿Cómo se supone que el autor de D haga este trabajo? ¿Se les exige a su mundo que llamen al autor de B por teléfono y les pidan 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 requeriría decir:

class D : B, MyInterface { public new void TestMethod(bool b = false) { base.TestMethod(b); } }

La característica propuesta parece agregar muchos inconvenientes para el programador sin un aumento correspondiente en el poder representativo. ¿Cuál es el atractivo de esta característica que justifica el aumento del costo para el usuario?

Noté que con los parámetros opcionales en C # 4 si especifica un parámetro como opcional en una interfaz, NO tiene que hacer que ese parámetro sea opcional en ninguna 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 los valores predeterminados especificados en las interfaces es útil, aunque para ser honesto, no estoy seguro de que pueda especificar valores predeterminados en la interfaz, ya que debería ser una decisión de implementación.

Por otro lado, esta desconexión significa que no siempre se puede usar indistintamente la clase concreta y la interfaz. Esto, por supuesto, no sería un problema si el valor predeterminado se especificara 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 El punto que tenga el valor predeterminado como llamante tendrá que proporcionarlo siempre de todos modos.


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 al que se llama.


Los parámetros opcionales son como una sustitución de macro de lo que entiendo. No son realmente opcionales desde el punto de vista del método. Un artefacto de eso es el comportamiento que ves donde obtienes diferentes resultados si lanzas a una interfaz.


Un parámetro opcional se acaba de etiquetar 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 sustituye por obj2.TestMethod(false); cuando el código C # se compila a IL, y no en tiempo JIT.

Entonces, en cierto modo, siempre es la persona que llama el que proporciona el valor predeterminado con parámetros opcionales. Esto también tiene consecuencias en el control de versiones binario: si cambia el valor predeterminado pero no vuelve a compilar el código de llamada, seguirá utilizando el valor predeterminado anterior.

Por otro lado, esta desconexión significa que no siempre se puede usar indistintamente la clase concreta y la interfaz.

Ya no puede hacerlo si el método de la interfaz se implementó explícitamente .