C#Nullable类型和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
会抛出exception,而第二个则不会。
所以,我的问题是这个。 使用Value
属性有什么意义? 似乎不需要获取实际值(即使它为null
),如果值确实为null
,则会抛出exception。
通常需要 – 只是在你的特定情况下。 x
的类型是Nullable
,而不是int
– 并且没有从Nullable
到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属性,否则将获得exception。 您的示例有效,因为Nullable重载了ToString()方法,C#编译器支持此类型的快捷方式。
当x
为null时, x.Value
将抛出System.InvalidOperationExceptionexception(无论x的类型是什么)
string + null = string
:没有exception
如果要将.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 + "<-");