c# - Valor predeterminado del parámetro OptionalAttribute?
default-value optional-parameters (1)
Las reglas son las siguientes:
- Para los parámetros de tipo
object
, se pasaType.Missing
. - Para otros tipos de referencia, se pasa
null
. - Para los tipos de valor, se pasa el valor predeterminado del tipo de valor .
- Para
Nullable<T>
esto significa que obtendrá unaNullable<T>
que es igual anull
(la propiedadHasValue
devolveráfalse
)
- Para
Tenga en cuenta que en el caso de todo excepto los parámetros de tipo object
, es el equivalente de default(T)
.
Me sorprendió un poco, ya que la especificación C # 4.0 no indicaba cuál sería el resultado, y espero que esté ahí.
También (según lo indicado por Scott Rippey en los comentarios ), esto se evalúa en tiempo de compilación, no es una operación en tiempo de ejecución, lo que significa que si tiene llamadas a este método en otros conjuntos que ya están implementados, y cambia la valor opcional, el valor predeterminado que se pasa al método no cambiará a menos que compile todo lo que hace la llamada contra el método en el ensamblaje.
Los argumentos con nombre y opcionales VS2010 de MSDN (Guía de programación de C #) nos informan sobre los parámetros opcionales en C #, mostrando el código que yo esperaba:
public void ExampleMethod(int required,
string optionalstr = "default string",
int optionalint = 10)
Ok, pero también dice:
También puede declarar parámetros opcionales utilizando la clase .NET OptionalAttribute. Los parámetros de atributo opcionales no requieren un valor predeterminado.
Leí la página de atributos opcionales de MSDN y realicé búsquedas en línea (que muestra a muchas personas que afirman que los parámetros de atributos opcionales no pueden ser consumidos por C #. ¿Supongo que estos comentarios se hicieron antes de C # 4?), Pero no puedo encontrar la respuesta a dos preguntas:
Si utilizo OptionalAttribute para definir un parámetro de C # como opcional:
- ¿Qué valor se usará si llamo a ese método y no especifico el valor de ese parámetro?
- ¿Se evaluará ese valor en tiempo de compilación o en tiempo de ejecución?