Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

356
Visualizações
¿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 Respostas
Responde à pergunta

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 Relatório

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda