web-dev-qa-db-fra.com

L'objet nullable doit avoir une valeur?

Sur la ligne: bool travel = fill.travel.Value; j'obtiens l'erreur suivante:

L'objet nullable doit avoir une valeur

et je ne sais pas pourquoi. Tout ce que je veux, c'est obtenir la valeur fausse dans la base de données des voyages. Toute aide serait appréciée. 

using (var db = new DataClasses1DataContext())
{
    var fill = (from f in db.expenseHdrs
                where f.rptNo == getPkRowReport()
                select f).FirstOrDefault();

    txtReportDesc.Text = fill.description;
    txtPeriod.Text = fill.period;
    txtPurpose.Text = fill.purpose;

    bool travel = fill.travel.Value;
    chkTravel.Checked = travel 
 }
28
Sealer_05

Vous pouvez toujours passer à

 fill.travel.GetValueOrDefault()

Fournir la valeur par défaut (false) ou la valeur de la colonne booléenne de la base de données. Ou vous pouvez spécifier la valeur par défaut avec une surcharge. Quoi qu'il en soit, le nullable n'a actuellement aucune valeur, c'est pourquoi vous obtenez cette exception.

40
Tejs

Vous essayez d'accéder à une propriété à partir d'un objet inexistant (votre fill.travel est null et vous appelez un accessoire depuis celui-ci), vous pouvez utiliser l'opérateur coalesce (.Net 4.0):

bool travel = fill.travel ?? false;
7
Val Bakhtin

Vous obtiendrez une InvalidOperationException si vous accédez à la propriété Nullable.Value lorsque la propriété HasValue est définie sur false.

4
Peter Ritchie

Vous pouvez vérifier si la variable Nullable a une valeur comme celle-ci avant que vous n'ayez réellement accès à sa valeur.

if(fill.travel.HasValue)
{
   bool travel = fill.travel.Value;
}
3
Adil

La valeur provenant de la base de données est un booléen nullable. Lorsque vous appelez Nullable.Value et que la valeur est null, vous obtenez cette exception. Envisagez de vérifier la propriété Nullable.HasValue avant d'appeler .Value.

2
Oblivion2000

Null n'est pas faux. Voir la série d'articles d'Eric Lippert sur ce sujet à l'adresse: http://blogs.msdn.com/b/ericlippert/archive/2012/03/26/null-is-not-false.aspx

Vous devez traiter un résultat nul en faux, si vous voulez le traduire. 

Pour rendre ce cas clair, considérons ce code:

bool travel;
bool? temptravel = fill.travel.Value;
if( temptravel == true )
    travel = true;
else
    travel = false;

Ou utilisez simplement la solution de Val Bakhtin si vous utilisez .Net 4

1
StarPilot

Vous pouvez toujours utiliser le classique C? opérateur comme ceci:

bool travel = (fill.travel == null ? false : fill.travel.Value);
0