2010-01-28 7 views
2

Définition avec un ternairenuméro datetime étrange .Net

DateTime filterDate = endDate.HasValue ? endDate.Value : DateTime.Now.AddDays(7); 

non ternaire

DateTime filterDate; 
if (endDate.HasValue) 
    filterDate = endDate.Value; 
else 
    filterDate = DateTime.Now.AddDays(7); 

Si vous déboguer ces deux déclarations de la valeur filterDate ne sera pas la même. Pourquoi est-ce?

Dans le premier exemple, filterDate se termine par la valeur 01/01/0001. Dans le deuxième exemple, j'obtiens le résultat attendu: filterDate est un datetime 7 jours dans le futur. À ce stade, j'ai même essayé de définir endDate = null juste pour s'assurer et voici une capture d'écran de ce qui se passe. alt text http://www.freeimagehosting.net/uploads/57bef2e50a.png

Chose la plus étrange que j'ai jamais vue.

+0

Avez-vous essayé de mettre entre parenthèses autour de votre ternaire? –

+0

Utilisez-vous un DateTime nullable pour votre endDate? (c'est-à-dire DateTime? endDate) – Shimrod

+1

Qu'est-ce que endDate? – serialhobbyist

Répondre

6

On dirait que endDate est en cours d'initialisation à DateTime.MinValue, pouvez-vous montrer le code où vous déclarez endDate?

également, d'une manière encore plus courte:

DateTime filterDate = endDate ?? DateTime.Now.AddDays(7); 
+0

Je l'ai essayé comme ça en premier et j'ai obtenu le même résultat que la version ternaire. Je pensais que peut-être l'objet DateTime ne supportait pas l'opérateur de coalescence nulle. EndDate est un paramètre d'une action de contrôleur mvc. Je ne fais rien passer donc ça devrait être nul. endDate est null si je l'observe rapidement. –

+0

D'accord. La seule façon de reproduire l'erreur était de définir endDate à la valeur min au lieu de null. – Bomlin

5

Je n'ai pas pu reproduire cela. En tout cas, c'est le meilleur moyen de le faire:

DateTime filterDate = endDate ?? DateTime.Now.AddDays(7);