在我的表单上,如果电影在bringback列中没有日期(日期类型),我想禁用bt_rent按钮,这意味着dvd仍然过期,无法出租:
var j = (from s in db.Rentals where s.Movietitle == (string)listbox1.SelectedValue select s).FirstOrDefault();
if (j.Bringback==null)
{
elerhetotext.Text = "The dvd is not available for renting";
bt_rent.Enabled = false;
}
else
{
elerhetotext.Text = "Rentable";
bt_rent.Enabled = true;
}
我得到的错误:
用户代码未处理Nullreferenceexpection(错误位于:if(j.Ringback==null))对象引用未设置为对象
您缺少对j本身的验证。在这种情况下,似乎没有您要查找的名称的DVD,因此理想情况下,您应该验证j是否为NULL,而不是
if (j.Bringback==null)
执行以下
if (j != null || (j != null && j.Bringback==null))
因此,您正在检查DVD是否存在,如果存在,则验证的第二部分基于j本身,并且Bringback是否为null。
Variavle j是给定代码中的一种对象Rental
<pre>
var j = (from s in db.Rentals where s.Movietitle == (string)listbox1.SelectedValue select s).FirstOrDefault();
</pre>
Chek j为空或与不同
<pre>
if (j==null)
{
elerhetotext.Text = "The dvd is not available for renting";
bt_rent.Enabled = false;
}
else
{
elerhetotext.Text = "Rentable";
bt_rent.Enabled = true;
}
</pre>
异常意味着j
本身就是null
,因此在访问j
的成员之前,您需要检查j
不是null
:
if (j == null) {
elerhetotext.Text = "DVD/movie does not exist";
bt_rent.Enabled = false;
} else if (j.Bringback == null) {
elerhetotext.Text = "The dvd is not available for renting";
bt_rent.Enabled = false;
} else {
elerhetotext.Text = "Rentable";
bt_rent.Enabled = true;
}
这只是mez编写的已接受答案的补充
使用C#6.0的空条件运算符可以将代码重写为:
var j = (from s in db.Rentals
where s.Movietitle == (string)listbox1.SelectedValue
select s).FirstOrDefault();
// checks whether `j´ is null or `j.Bringback´ is null
if (j?.Bringback == null)
{
elerhetotext.Text = "The dvd is not available for renting";
bt_rent.Enabled = false;
}
else
{
elerhetotext.Text = "Rentable";
bt_rent.Enabled = true;
}
声明
if (j != null || (j != null && j.Bringback==null))
将被重写为
if (j?.Bringback == null)