如何在C#中检查可空类型中的空值?

时间:2014-01-03 07:35:02

标签: c#

如何检查可空类型的空值?

这是我的代码

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属性,DatesDate异议的集合。以下是它们的定义方式:

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对象必须有值”

现在我该如何检查此错误。

3 个答案:

答案 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");
        }