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)
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.
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
.
, 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;
}
}
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)
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.
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
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,