C#Nullable类型和Value属性

时间:2011-03-23 13:22:49

标签: c#

在获取可空类型中包含的值时,必须使用可空类型的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,则会抛出异常。

5 个答案:

答案 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)

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