Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

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

Noté que con los parámetros opcionales en C# 4, si especifica un parámetro 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 si debería poder 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 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 luego, si está exponiendo su clase concreta como interfaz (usando algún marco IOC para inyectar la clase concreta, por ejemplo) entonces realmente no hay punto que tiene el valor predeterminado, ya que la persona que llama siempre tendrá que proporcionarlo de todos modos.

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

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 que 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 también haga que el parámetro sea opcional?

Supongamos que hicimos eso. Ahora suponga 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 hará este trabajo? ¿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é sucede si dos personas llaman al autor de B y una de ellas quiere que el valor predeterminado sea verdadero y otra quiere que sea falso? ¿Qué pasa si el autor de B simplemente se niega a seguirle el juego?

Tal vez en ese caso estarían obligados 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 beneficio convincente de esta función que justifica el aumento del costo para el usuario?


ACTUALIZACIÓN: en los comentarios a continuación, supercat sugiere una función de idioma que realmente agregaría poder al idioma y permitiría algunos escenarios similares al descrito en esta pregunta. FYI, esa característica (implementaciones predeterminadas de métodos en interfaces) se agregará a C# 8.

over 4 years ago · Santiago Trujillo Denunciar

0

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

Entonces, en cierto modo, siempre es la persona que llama 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á usando el valor predeterminado anterior.

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

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

over 4 years ago · Santiago Trujillo Denunciar

0

Porque 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 que se llama, sino al tipo de referencia a través del cual se llama.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda