2013-01-03 5 views
4

J'ai déposé txtb_dateOfService est nécessaire pour remplir le formulaire, mais si txtb_dateOfService est emapty return null sinon TryParse la date > j'ai eu cette erreur, je ne sais pas comment le résoudrecomment convertir datetime? datetime

La meilleure méthode surchargée match pour la 'System.DateTime.TryParse (string, hors System.DateTime)' a quelques arguments invalides

DateTime? dateOfService= null; 
    if (string.IsNullOrEmpty(txtb_dateOfService.Text)) 
    { 
     dateOfService = null; 

    } 
    else 
     if (DateTime.TryParse(txtb_dateOfService.Text, out dateOfService)) 
     { 

     } 
+2

Y a-t-il une raison pour laquelle vous utilisez le nullable en premier lieu? Ce code semble pouvoir très facilement être réécrit sans nullables. –

+2

Vous pouvez également utiliser le ?? opérateur en C# à "déréférencer" un nullable (et fournir une valeur par défaut si le nullable est en fait nul). – ravuya

+0

Que voulez-vous faire si 'txtb_dateOfService.Text' n'est pas vide mais pas une valeur date/heure valide (parseable)? –

Répondre

5

Vous ne pouvez pas passer une référence à DateTime? en une méthode prévoyant DateTime. Vous pouvez résoudre ce problème en introduisant une variable temporaire, comme ceci:

else { // <<=== This is the final "else" from your code 
    DateTime tmp; 
    if (DateTime.TryParse(txtb_dateOfService.Text, out tmp)) 
    { 
     dateOfService = tmp; 
    } else { 
     dateOfService = null; 
    } 
} 
+0

Cela ne devrait-il pas être 'dateOfService.Value = tmp'? –

+1

@JoelEtherton C# prend soin de cela automatiquement. – dasblinkenlight

+0

Cela ne fonctionnera pas, vérifiez ma réponse. –

1

Votre problème est convertissait DateTime?-DateTime, et non vice versa. Le paramètre out de la méthode DateTime.TryParse n'est pas nullable; dans le cas TryParse échoue le paramètre out sera affecté DateTime.MinValue comme sa valeur. Il n'y a aucune raison de déclarer votre variable dateOfService en tant que type Nullable à partir de cet extrait.

1

Vous pouvez lancer une exception si l'analyse échoue:

DateTime? dateOfService= null; 
if (string.IsNullOrEmpty(txtb_dateOfService.Text)) 
{ 
    dateOfService = null; 
} 
else 
{ 
    // will throw an exception if the text is not parseable 
    dateOfService = DateTime.Parse(txtb_dateOfService.Text); 
} 

ou utiliser un DateTime intermédiaire pour stocker le résultat de l'analyse:

DateTime? dateOfService= null; 
if (string.IsNullOrEmpty(txtb_dateOfService.Text)) 
{ 
    dateOfService = null; 

} 
else 
{ 
    DateTime temp; 
    if (DateTime.TryParse(txtb_dateOfService.Text, out temp)) 
    { 
     dateOfService = temp; 
    } 
    else 
    { 
     dateOfService = null; 
    } 
} 

ou l'autre de ceux-ci peuvent être logiquement simplifiée; Je montre l'évasion complète pour transmettre la logique.

0

Vous pouvez essayer de convertir votre string dans un DateTime

DateTime? dataOfService = null; 
DateTime output; 

if (DateTime.TryParse(txtb_dateOfService.Text, out output)) 
    dataOfService = output; 

maintenant vous pouvez utiliser dataOfService comme Nullable<DateTime> et vérifier si elle a des données valides et converties en utilisant HasValueValue propriétés.

0

vous devez créer une valeur de température pour maintenir paramètre de TryParse:

DateTime tmp; 
if (DateTime.TryParse(txtb_dateOfService.Text, out tmp)) { 
    dateOfService = tmp; 
} else{ 
    dateOfService = null; 
} 

Un exemple plus laconique

DateTime tmp; 
DateTime? dateOfService = DateTime.TryParse(txtb_dateOfService.Text, out tmp) 
    ? tmp 
    : (DateTime?)null; 
0

essayer dateOfService.Value, cela devrait fonctionner (je pense)

+1

Vous ne pouvez pas transmettre les propriétés en tant que paramètre out, voir: http://stackoverflow.com/questions/1370238/passing-a-property-as-an-out-parameter-in-c-sharp –