Нулемый объект должен иметь значение?

21

В строке: bool travel = fill.travel.Value; Я получаю следующую ошибку:

  

Nullable object должен иметь значение

, и я не уверен, почему. Все, что я хочу сделать, это получить значение в базе данных путешествия, которое в настоящее время является ложным. Любая помощь будет оценена по достоинству.

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 
 }
    
задан Sealer_05 11.05.2012 в 19:05
источник
  • , что возвращает getPkRowReport? –  Daniel A. White 11.05.2012 в 19:06
  • Похоже, что fill.travel является nullable bool (bool?), и он является NULL в базе данных. –  driis 11.05.2012 в 19:07
  • @driis, вот ответ, так что вы можете его переместить ниже. –  Kirk Woll 11.05.2012 в 19:08
  • Если вам нужна точная справка, укажите строку, которая вызывает ошибку. –  Peter Ritchie 11.05.2012 в 19:09
  • @ DanielA.White Он возвращает pk выбранной записи в сетке. –  Sealer_05 11.05.2012 в 19:50
Показать остальные комментарии

6 ответов

35

Вы всегда можете переключиться на

 fill.travel.GetValueOrDefault()

Предоставить значение по умолчанию (false) или значение булевского столбца из базы данных. Или вы можете указать значение по умолчанию с перегрузкой. В любом случае, nullable в настоящее время не имеет значения, поэтому вы получаете это исключение.

    
ответ дан Tejs 11.05.2012 в 19:10
5

Вы пытаетесь получить доступ к свойству из несуществующего объекта (ваш fill.travel имеет значение null, и вы вызываете его) вы можете использовать оператор coalesce (.Net 4.0):

bool travel = fill.travel ?? false;
    
ответ дан Val Bakhtin 11.05.2012 в 19:29
3

Вы можете проверить, имеет ли значение переменной NULL значение, подобное этому, до того, как вы действительно получите доступ к его значению

if(fill.travel.HasValue)
{
   bool travel = fill.travel.Value;
}
    
ответ дан Adil 11.05.2012 в 19:10
3

Вы получите InvalidOperationException , если вы получите доступ к свойству Nullable.Value, когда свойство HasValue является ложным.

    
ответ дан Peter Ritchie 11.05.2012 в 19:10
2

Значение, поступающее из базы данных, является логическим значением с нулевым значением. Когда вы вызываете Nullable.Value, а значение равно null, вы получите это исключение. Рассмотрите возможность проверки свойства Nullable.HasValue перед вызовом .Value.

    
ответ дан Oblivion2000 11.05.2012 в 19:11
1

Null не является ложным. См. Статью в блоге Эрика Липперта об этом по адресу: Ссылка

Вам нужно обработать нулевой результат в false, если вы хотите его перевести.

Чтобы сделать этот случай ясным, рассмотрите этот код:

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

Или просто используйте решение Вала Бахтина, если вы используете .Net 4

    
ответ дан StarPilot 11.05.2012 в 20:05