在获取可空类型中包含的值时,必须使用可空类型的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
,则会抛出异常。
答案 0 :(得分:27)
通常需要 - 只是不在您的特定情况下。 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);
答案 1 :(得分:9)
x
和x.Value
有不同的类型。
static void Meth(int i)
{
int? x = 5;
Meth(x);
Meth(x.Value);
}
第二行无法编译。
因此使用x.Value
的原因显而易见 - 您需要在需要实际值时调用它。 NullReferenceException
是合理的,因为null
与值类型的值不对应。
答案 2 :(得分:2)
如果HasValue属性返回true,则应该访问Value属性,否则会出现异常。 您的示例有效,因为Nullable重载了ToString()方法,C#编译器支持此类型的快捷方式。
答案 3 :(得分:2)
当x
为空时x.Value
将抛出System.InvalidOperationException异常(无论x的类型是什么)
string + null = string
:无例外
答案 4 :(得分:0)
如果要将.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 + "<-");