[英]C# Nullable Types and the Value property
我有点不清楚何时/是否在获取可空类型中包含的值时必须使用可空类型的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
的类型是Nullable<int>
,而不是int
- 并且没有从Nullable<T>
到T
隐式转换。
不过,让我们看看您的示例中发生了什么。 您的最后一行正在转换为:
Console.WriteLine(string.Concat("The value of 'x' is ", x));
这是拳击x
,这将导致无论是盒装int
或空引用...这两者都是通过处理string.Concat
。
当您不通过字符串连接转换为字符串时,例如,如果您想要:
int nonNullable = x.Value;
那么你就必须使用Value
属性-或有明确的转换,也可能是空合并运算符,或一个电话GetValueOrDefault
:
int nonNullable = (int) x;
int alternative = x ?? 20;
int andAnother = x.GetValueOrDefault(20);
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
为空时x.Value
会抛出 System.InvalidOperationException 异常(不管 x 的类型是什么)
string + null = string
:也不例外
如果您想将 .value 用于可为空的 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 + "<-");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.