2016-06-21 3 views
0

Je lis des valeurs de champs qui peuvent contenir une date non formatée ou un espace, j'ai besoin de convertir la chaîne des champs remplis en datetime et de les réécrire. Je suis en train de ce qui suit, mais l'erreur « objet Nullable doit avoir une valeur »:Erreur de conversion de date/heure nullable

DateTime? localVersion = null; 
DateTime? serverVersion = null; 

if(!string.IsNullOrWhiteSpace(item.cellValueLocal)) 
{ 
    localVersion = DateTime.ParseExact(item.cellValueLocal, "ddMMyyyy", System.Globalization.CultureInfo.InvariantCulture); 
} 

if (!string.IsNullOrWhiteSpace(item.cellValueServer)) 
{ 
    serverVersion = DateTime.ParseExact(item.cellValueServer, "ddMMyyyy", System.Globalization.CultureInfo.InvariantCulture); 
} 

localVersion.Value.ToString("dd.MM.yyyy", CultureInfo.InvariantCulture); 
serverVersion.Value.ToString("dd.MM.yyyy", CultureInfo.InvariantCulture); 

Quelqu'un peut-il offrir aucune indication sur ce que la question pourrait être ici s'il vous plaît?

+0

Quelle ligne fait des erreurs bien? – pay

+0

Essayez de les définir sur une valeur par défaut, par exemple 'DateTime? localVersion = new DateTime (2015, 1, 18); '' – Majestic

+5

Que pensez-vous qu'il arrivera si (par exemple)' item.cellValueLocal' * est * null ou un espace? –

Répondre

3

Si votre cellValue est null (ou un espace), vos instances DateTime ne seront pas initialisées et seront toujours définies sur null. Vous ne pouvez pas accéder à .Value sur une instance nullable sans valeur. Vous devez vérifier avec .HasValue premier:

if (localVersion.HasValue) { 
    localVersion.Value.ToString(...); 
} 
+0

Cela ne fera rien puisque vous n'attribuez pas le résultat de l'appel 'ToString' à une variable. –

+0

@ChrisDunaway: oui. Exécuter du code supplémentaire si nécessaire ... – knittl

1

Les lignes:

localVersion.Value.ToString("dd.MM.yyyy", CultureInfo.InvariantCulture); 
serverVersion.Value.ToString("dd.MM.yyyy", CultureInfo.InvariantCulture); 

sont des erreurs. Si item.cellValueLocal ou item.cellValueServer est vide ou vide alors localVersion.Value et serverVersion.Value ne seront jamais affectés d'une valeur non nulle, et donc Value lèvera une exception quand vous y accéderez.

Vous devez remplacer les opérations avec:

if (localVersion.HasValue) 
    localVersion.Value.ToString("dd.MM.yyyy", CultureInfo.InvariantCulture); 

Sinon, vous pouvez utiliser l'opérateur coalescent null:

DateTime version = localVersion ?? DateTime.Now; 

Remplacement DateTime.Now avec une valeur par défaut appropriée. En C# 6, vous pouvez utiliser la syntaxe ?. pour simplifier davantage à:

string version = localVersion?.ToString("dd.MM.yyyy", CultureInfo.InvariantCulture) ?? String.Empty; 

Ce qui fait la ligne de contrôle nul.

+0

En fait 'Value' n'est pas' null' dans ce cas, c'est juste que le type 'Nullable ' garde l'accès à 'Value' basé sur' HasValue' étant faux. – juharr

+0

@juharr - Bien, j'ai changé le libellé. – theB

0

Si vous compilez la dernière version de C# (6.0) compilateur vous pouvez raccourcir cet autre pour être

localVersion?.ToString("dd.MM.yyyy", CultureInfo.InvariantCulture) 
+0

Cela ne fera rien puisque vous n'assignez pas le résultat de l'appel 'ToString' à une variable. –

+0

yeh je sais, reflète la question .... qui ne fait rien non plus. –