web-dev-qa-db-fra.com

Le paramètre par défaut pour la valeur doit être une constante de temps de compilation?

Ceci est ma signature de méthode. En essayant de passer end comme paramètre facultatif, cela me donne cette erreur. Que dois-je faire pour résoudre ce problème? Pourquoi n'est-ce pas DateTime.MinValue une constante?

public static void DatesToPeriodConverter(DateTime start, DateTime end = DateTime.MinValue,
                                          out string date, out string time)
48
Ankit

DateTime.MinValue n'est pas un const, car la langue n'aime pas const sur DateTime. Une option consiste à utiliser DateTime? à la place, c'est-à-dire.

public static void DatesToPeriodConverter(DateTime start, DateTime? end = null,
     out string date, out string time)
{
    var effectiveEnd = end ?? DateTime.MinValue;
    // ...
}

Cependant, vous aurez toujours le problème d'avoir des paramètres non par défaut après paramètres par défaut - vous devrez peut-être les réorganiser pour les utiliser par défaut.

70
Marc Gravell

Utilisez plutôt des surcharges de méthode régulières:

public static void DatesToPeriodConverter(DateTime start, out string date, out string time)
{
    DatesToPeriodConverter(start, DateTime.MinValue, out date, out time);  
}

public static void DatesToPeriodConverter(DateTime start, DateTime end, out string date, out string time) 
{ }

En variante, default(DateTime) est identique à DateTime.MinValue et est une constante de temps de compilation, mais j'ai tendance à m'éloigner de l'utilisation de ce style (il n'y a aucune garantie à l'avenir que default(DateTime) sera égal à DateTime.MinValue):

public static void DatesToPeriodConverter(DateTime start, DateTime end = default(DateTime), out string date, out string time)

Ou comme Marc le suggère, utilisez DateTime? qui permet une valeur par défaut null.

16
Adam Houldsworth

Vous pouvez essayer de le faire de cette façon:

public static void DatesToPeriodConverter(DateTime start, DateTime? end , out string date, out string time)
{
    if(!end.HasValue){
        end = DateTime.MinValue;
    }
}
4
Adam Moszczyński

Changez un type de fin de paramètre en Nullable et utilisez null comme valeur par défaut:

public static void DatesToPeriodConverter(DateTime start, DateTime? end = null, out string date, out string time)

ou utilisez default (DateTime) comme valeur par défaut:

public static void DatesToPeriodConverter(DateTime start, DateTime end = default(DateTime), out string date, out string time)
3
Viacheslav Ivanov

Vous avez raison. Le paramètre par défaut de la valeur doit être une constante de temps de compilation. La valeur calculée dynamiquement n'est pas acceptée par le compilateur par rapport au paramètre facultatif. La raison derrière cela peut être qu'il n'est pas certain que la valeur dynamique que vous fournissez donnera une valeur valide.

2
Adarsh Kumar

Les paramètres facultatifs doivent apparaître à la fin de la liste des paramètres. out les paramètres doivent également apparaître à la fin de la liste des paramètres. Votre paramètre facultatif n'est pas un paramètre out.

De plus, vous ne pouvez pas utiliser de valeurs par défaut pour des paramètres facultatifs autres que des constantes littérales et quelques cas de coin étranges.

Tous les faits vont dans le sens suivant:

  • Créez une méthode de surcharge secondaire.
  • Faire en sorte que la méthode initiale n'inclue pas le paramètre
  • Faire le secondaire inclure le paramètre
  • Appelez votre méthode plus générale (celle avec le paramètre) à partir de votre méthode plus spécifique et implémentez la logique uniquement dans la plus générale
1
Eduard Dumitru