C# C可为null的类型和Value属性
在获取可空类型中包含的值时,我不太清楚何时/是否必须使用可空类型上的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
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 + "<-");