2011-03-23 184 views
13

我有点不清楚何时/如果必须使用可空类型的Value属性获取可空类型中包含的值。考虑下面的例子:C#可为空类型和值属性

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,则会抛出异常。

回答

20

通常需要 - 只是不在你的具体情况。 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

或者可能x.GetValueOrDefault(20),但是空合并显然很好,不知道这是可能的。 – jishi 2011-03-23 13:32:03

+0

@jishi:不错的选择,我会在那里添加它。 – 2011-03-23 13:34:29

5

xx.Value有不同的类型。

static void Meth(int i) 
    { 
     int? x = 5; 
     Meth(x); 
     Meth(x.Value); 
    } 

第二行不编译。

所以使用x.Value的原因很明显 - 您需要在需要实际值时调用它。而NullReferenceException是合理的,因为null不对应价值类型的值。

+0

但是你可以有'Meth((int)x);'它会被编译。 :) – 2011-03-23 13:34:11

+2

@Shadow Wizard'(int)x'与'x.Value' – Andrey 2011-03-23 13:41:04

0

如果HasValue属性返回true,那么您应该访问Value属性,否则您将得到一个异常。 您的示例工作原因是Nullable重载了ToString()方法,并且C#编译器支持此类型的快捷方式。

0

x为空时x.Value会抛出一个System。InvalidOperationException异常(不管是x的类型)

string + null = string:未见异常

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