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 – 并且没有从NullableT 隐式转换。

让我们来看看你的例子中发生了什么。 您的最后一行将被转换为:

 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); 

xx.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 + "<-");