Le paramètre par défaut de value doit être une constante de compilation?

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

public static void DatesToPeriodConverter(DateTime start, DateTime end = DateTime.MinValue, out string date, out string time)
39
demandé sur zx485 2013-09-11 15:52:10

7 réponses

DateTime.MinValue n'est pas un const, parce que 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 l'utiliser par défaut.

59
répondu Marc Gravell 2013-09-11 11:54:01

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) 
{ }

Atlernativement, default(DateTime) est le même que DateTime.MinValue et est constant dans le temps de compilation, mais j'ai tendance à me tromper d'utiliser 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.

13
répondu Adam Houldsworth 2013-09-11 11:53:52

, 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
répondu Adam Moszczyński 2013-09-11 11:57:53

Modifiez un type du paramètre end 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
répondu Viacheslav Ivanov 2013-09-11 11:56:26

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

2
répondu Adarsh Kumar 2013-09-11 11:56:24

Les paramètres optionnels 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 optionnel n'est pas un paramètreout .

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

Tous les faits pointent dans la direction suivante:

  • crée une méthode de surcharge secondaire.
  • Faire en sorte que la méthode initiale ne inclure le paramètre
  • Faire en sorte que le secondaire inclue le paramètre
  • Appeler votre méthode plus générale (l'un avec le paramètre) à partir de votre plus précis et implémenter la logique seulement dans le plus général
1
répondu Eduard Dumitru 2013-09-11 11:56:39

Nous pouvons créer une classe de constantes avec des valeurs par défaut

Public const int DEFAULTINT = -9999;

Et les utiliser comme constantes.DEFAULTINT comme valeur par défaut de l'entreprise..

J'espère que ça aide,

-1
répondu HydTechie 2013-12-03 15:45:28