C# C可为null的类型和Value属性

C# C可为null的类型和Value属性,c#,C#,在获取可空类型中包含的值时,我不太清楚何时/是否必须使用可空类型上的Value属性。考虑下面的例子: int? x = 10; Console.WriteLine("The value of 'x' is " + x.Value); Console.WriteLine("The value of 'x' is " + x); 这两个函数都返回相同的值10 但是,如果我最初将x设置为null,则第一个Console.WriteLine会引发异常,而第二个则不会 所以,我的问题是。使用Value

在获取可空类型中包含的值时,我不太清楚何时/是否必须使用可空类型上的Value属性。考虑下面的例子:

int? x = 10;

Console.WriteLine("The value of 'x' is " + x.Value);
Console.WriteLine("The value of 'x' is " + x);
这两个函数都返回相同的值10

但是,如果我最初将x设置为null,则第一个Console.WriteLine会引发异常,而第二个则不会

所以,我的问题是。使用Value属性有什么意义?即使实际值为null,也似乎不需要获取它,如果值确实为null,它将引发异常。

通常需要它,但在特定情况下不需要。x的类型是可空的,而不是int-并且没有从可空到T的隐式转换

让我们看看您的示例中发生了什么。您的最后一行正在转换为:

Console.WriteLine(string.Concat("The value of 'x' is ", x));
这就是装箱x,它将导致装箱整型或空引用。。。这两个都由string.Concat处理

当您不通过字符串串联转换为字符串时,例如,如果您需要:

int nonNullable = x.Value;
然后您必须使用Value属性或显式强制转换,或者可能使用null合并运算符,或者调用GetValueOrDefault:

x和x.Value有不同的类型

    static void Meth(int i)
    {
        int? x = 5;
        Meth(x);
        Meth(x.Value);
    }
第二行不编译


所以使用x.Value的原因很明显——当需要实际值时需要调用它。而NullReferenceException是合理的,因为null与值类型的值不对应。

如果HasValue属性返回true,则应该访问value属性,否则将得到异常。 您的示例之所以有效,是因为Nullable重载了ToString方法,并且C编译器支持这种类型的快捷方式

当x为null时,无论x的类型是什么,x.Value都将引发System.InvalidOperationException异常


string+null=string:如果要将.value用作可为null的int,则无例外。您可以这样检查值

int? x = null;
int valXX = x.HasValue ? x.Value : 0;
Console.WriteLine("The value of 'x' is ->" + x + "<-");
Console.WriteLine("The value of 'valXX' is ->" + valXX + "<-");

或者可能是x.GetValuerDefault20,尽管空合并显然很好,但不知道这是可能的。@jishi:好的选择,我将它添加到其中。但是您可以使用Methintx;它将编译:@阴影向导intx与x.Value相同
int? x = null;
int valXX = x.HasValue ? x.Value : 0;
Console.WriteLine("The value of 'x' is ->" + x + "<-");
Console.WriteLine("The value of 'valXX' is ->" + valXX + "<-");