如何检查可空类型的空值?
这是我的代码
public int? ContractYear
{
get
{
if (Dates.FindIndex((Date d) => d.Type == DateType.Issue) == -1)
return null;
return DateTime.Now.Year -
Dates.First((Date d) => d.Type == DateType.Issue).Year.Value;
}
}
在上面的代码中,Date
是一个自定义类型,在我的代码中包含Year属性,Dates
是Date
异议的集合。以下是它们的定义方式:
public List<Date> Dates // initialized elsewhere
public class Date
{
public DateType Type { get; set; } //DateType is an enum
public int? Year { get; set; }
//additional properties
}
在行.Year.Value
中我收到错误,因为如果年份可能是null
,那么我们无法获得年份的值,它会抛出“Nullable对象必须有值”
现在我该如何检查此错误。
答案 0 :(得分:2)
您可以使用yournullableType。HasValue检查值是否有值
可空类型的每个实例都有两个公共只读属性: 的的HasValue 强> HasValue属于bool类型。当变量包含非null值时,它设置为true。 的值强> 值与基础类型的类型相同。如果HasValue为true,则Value包含有意义的值。如果HasValue为false,则访问Value将抛出InvalidOperationException。
像
int? x = 10;
if (x.HasValue)
{
System.Console.WriteLine(x.Value);
}
else
{
System.Console.WriteLine("Undefined");
}
答案 1 :(得分:2)
要回答您的问题,当Year
为空时,您会收到错误消息。使用可空类型时,如果值为null,则调用Value
属性将引发异常。
为避免这种情况,您需要使用HasValue
属性并在调用Value
之前进行检查。但是,您需要决定如何处理此特定问题,特别是当Year为null时您想要做什么?
public int? ContractYear
{
get
{
var firstIssueDate = Dates.FirstOrDefault((Date d) => d.Type == DateType.Issue);
if (firstIssueDate == null)
{
return null;
}
else if (firstIssueDate.Year.HasValue)
{
return DateTime.Now.Year - firstIssueDate .Year.Value;
}
else
{
return ???
//this is what you need to decide,
// what do you want to return when Year is null?
}
}
}
当Year
为空时,还有其他替代方法可以处理这种情况,具体取决于发生这种情况时要返回的内容。另一个非常常见的模式是条件运算符(?:
)
return DateTime.Now.Year -
firstIssueDate.Year.HasValue ? firstIssueDate.Year.Value : 0;
// you can replace the 0 above with whatever
// value you want to use in lieu of a null Year.
答案 2 :(得分:0)
Nullable类型是System.Nullable结构的实例。可空类型可以表示其基础值类型的正确值范围,以及额外的空值。例如,可以为发音为“Nullable of Int32”的Nullable分配从-2147483648到2147483647的任何值,或者可以为其指定空值。
static void Main()
{
int? num = null;
// Is the HasValue property true?
if (num.HasValue)
{
System.Console.WriteLine("num = " + num.Value);
}
else
{
System.Console.WriteLine("num = Null");
}