可以为空的对象必须有值吗?

时间:2012-05-11 17:05:03

标签: c# .net linq-to-sql exception-handling nullable

在线:bool travel = fill.travel.Value;我收到以下错误:

  

Nullable对象必须具有值

我不知道为什么。我想要做的就是获取当前错误的旅行数据库中的值。任何帮助,将不胜感激。

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 
 }

8 个答案:

答案 0 :(得分:42)

您可以随时切换到

 fill.travel.GetValueOrDefault()

提供默认值(false)或数据库中boolean列的值。或者您可以指定带有重载的默认值。无论哪种方式,nullable当前都没有值,这就是你获得该异常的原因。

答案 1 :(得分:8)

您正在尝试从不存在的对象访问属性(您的fill.travel为null,并且您从中调用prop), 你可以使用coalesce operator(.Net 4.0):

bool travel = fill.travel ?? false;

答案 2 :(得分:4)

如果您在HasValue属性为false时访问Nullable.Value属性,您将获得InvalidOperationException

答案 3 :(得分:3)

在实际访问其值

之前,您可以检查可空变量是否具有这样的值
if(fill.travel.HasValue)
{
   bool travel = fill.travel.Value;
}

答案 4 :(得分:3)

来自数据库的值是可以为空的布尔值。当您调用Nullable.Value,并且值为null时,您将获得此异常。在调用.Value之前,请考虑检查属性Nullable.HasValue。

答案 5 :(得分:1)

Null不是假的。请参阅Eric Lippert关于此的博客文章系列:http://blogs.msdn.com/b/ericlippert/archive/2012/03/26/null-is-not-false.aspx

如果您希望翻译它,则需要将null结果处理为false。

为了清楚这一点,请考虑以下代码:

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

如果您使用的是.Net 4

,请使用Val Bakhtin的解决方案

答案 6 :(得分:0)

您始终可以使用经典C语言吗?像这样的运算符:

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

答案 7 :(得分:0)

发生这种情况是因为有这样的代码:

bool? someVariable = (bool)someNullableBool;

someNullableBool为空,并且引发了此错误。

解决方案是将其重写为:

bool? someVariable = (bool?)someNullableBool;