繁体   English   中英

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

[英]How can check null value in nullable type in 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行中,我收到错误消息,因为如果year可以为null则无法获得year的值,它将抛出“ Nullable对象必须具有值”

现在如何检查该错误。

您可以使用yournullableType检查值。 HasValue检查是否具有hasValue

每个可空类型的实例都有两个公共的只读属性: HasValue HasValue的类型为bool。 当变量包含非空值时,将其设置为true。 值与基础类型相同。 如果HasValue为true,则Value包含有意义的值。 如果HasValue为false,则访问Value将引发InvalidOperationException。

喜欢

int? x = 10;
if (x.HasValue)
{
    System.Console.WriteLine(x.Value);
}
else
{
    System.Console.WriteLine("Undefined");
}

要回答您的问题,当Year为空时,您会收到错误消息。 使用可为空的类型时,如果值为null则调用Value属性将引发异常。

为了避免这种情况,您需要使用HasValue属性并在调用Value之前对其进行检查。 但是,您需要决定如何处理此特定问题,特别是Year为空时您想做什么?

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.

可空类型是System.Nullable结构的实例。 可空类型可以表示其基础值类型的正确值范围,以及附加的空值。 例如,可以为Nullable(发音为“ 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");
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM