c# optional-parameters

¿Por qué DateTime.MinValue no se puede utilizar como parámetro opcional en C#?



optional-parameters (7)

DateTime.MinValue es de readonly , y según MSDN, los valores de solo lectura no son constantes de tiempo de compilación:

La palabra clave readonly es diferente de la palabra clave const. Un campo const solo se puede inicializar en la declaración del campo. Un campo de solo lectura puede inicializarse en la declaración o en un constructor. Por lo tanto, los campos de solo lectura pueden tener diferentes valores dependiendo del constructor utilizado. Además, mientras que un campo const es una constante de tiempo de compilación, el campo de solo lectura se puede usar para constantes de tiempo de ejecución

Estaba escribiendo un método que toma el valor DateTime como uno de sus parámetros. Decidí que es un parámetro opcional, así que seguí adelante e intenté hacer DateTime.MinValue como predeterminado.

private void test(string something, DateTime testVar = DateTime.MinValue) { }

Sin embargo, esto da un error que:

El valor de parámetro predeterminado para ''testVar'' debe ser una constante de compilación.

Usar este código parece funcionar bien.

private void test(string something, DateTime testVar = new DateTime()) { }

Me dieron consejos para usar DateTime.MinValue en lugar de la nueva DateTime (), ya que es autodocumentada. Dado que el new DateTime() es básicamente lo mismo, ¿por qué no se puede usar DateTime.MinValue ? ¿También habrá algún problema potencial si lo dejo con el new DateTime() ?


Otra alternativa sería tener 2 sobrecargas de método:

  • Uno que toma un parámetro DateTime
  • Uno que no toma el parámetro DateTime

La ventaja de esto es que no tendría que comprobar si el parámetro es nulo y quedaría claro cuál es su intención. Internamente, el método 1 puede agregar un nulo a la base de datos.


Otras respuestas se refieren a por qué DateTime.MinValue no se puede usar, no es una constante de tiempo de compilación legal. Es un campo de static readonly , que podría ser constante en lo que respecta al uso, pero no es legalmente constante, ni se ajusta a las reglas de lo que puede usarse como argumento predeterminado. En cuanto a por qué se puede usar el new DateTime() , consulte la sección 10.6.1 de la Especificación de lenguaje C # 4.0 . Bits relevantes:

La expresión en un argumento predeterminado debe ser uno de los siguientes:

· Una expresión constante

· Una expresión de la forma nueva S () donde S es un tipo de valor

· Una expresión del formulario por defecto (S) donde S es un tipo de valor

Esto da como resultado una instancia inicializada en cero, básicamente un patrón de bits de todos los ceros. (Ver: Sección 4.1.2)

Sin embargo, en este caso, todavía recomiendo usar un DateTime? value = null DateTime? value = null como el parámetro y el argumento predeterminado, particularmente cuando representa una fecha anulable en una base de datos. MinValue no es la ausencia de un valor. null es


Según lo que conozco, el valor predeterminado de DateTime es DateTime.MinValue, ¿por qué no usar simplemente DateTime ()?


Usa esta declaración

private void test(string something, DateTime testVar = new DateTime()) { if ( testVar != new DateTime() ) { DoSomethingUsefulWithTimestamp( something , testVar.Value ) ; } else { DoSomethingElseWithoutTimestamp( something ) ; } }

Debería funcionar mucho mejor. Es un fastidio que la nula no funcione, porque tendría más sentido.


DateTime.MinValue (y DateTime.MaxValue ) son miembros de public static readonly lugar de constantes de tiempo de compilación.

En lugar de usar DateTime.MinValue como su valor predeterminado, ¿por qué no usar un DateTime ( DateTime? ) DateTime? . Eso hace que su intención sea más clara que el valor predeterminado más bajo posible de datetime.

Algo como esto:

private void test(string something, DateTime? testVar = null ) { if ( testVar.HasValue ) { DoSomethingUsefulWithTimestamp( something , testVar.Value ) ; } else { DoSomethingElseWithoutTimestamp( something ) ; } return ; } private void DoSomethingUsefulWithTimestamp( string something , DateTime dt ) { ... // something useful } private void DoSomethingElseWithoutTimestamp( string something ) { ... // something useful }

Alternativamente, establezca su valor predeterminado en su cuerpo de método:

private void test(string something, DateTime? testVar = null ) { DateTime dtParameter = testVar ?? DateTime.MinValue ; DoSomethingUsefulWithTimestamp( something , dtParameter ) ; }


DateTime.MinValue se define como:

public static readonly DateTime MinValue

Que no es lo mismo que const . Dado que un valor de readonly no es una constante de tiempo de compilación (es decir, el valor no se evalúa en tiempo de compilación), no se puede utilizar.

La razón por la que funciona el new DateTime() es porque esa expresión se conoce en tiempo de compilación. Es lo mismo que escribir por default(DateTime) . Por ejemplo, result == true en la siguiente expresión:

var result = new DateTime() == default(DateTime);