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