C#Nullable类型和Value属性

Ran*_*der 18 c#

我有点不清楚在Value获取可空类型中包含的值时何时/是否必须使用可空类型的属性.请考虑以下示例:

int? x = 10;

Console.WriteLine("The value of 'x' is " + x.Value);
Console.WriteLine("The value of 'x' is " + x);
Run Code Online (Sandbox Code Playgroud)

这两个都返回相同的值(10).

但是,如果我最初设置xnull,则第一个Console.WriteLine抛出异常而第二个抛出异常.

所以,我的问题是这个.使用该Value物业有什么意义?似乎不需要获取实际值(即使它是null),并且如果值确实会抛出异常null.

Jon*_*eet 28

通常需要-只是没有你的具体情况.该类型的xNullable<int>,没有int-而且也没有隐含的转换,从Nullable<T>T.

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

Console.WriteLine(string.Concat("The value of 'x' is ", x));
Run Code Online (Sandbox Code Playgroud)

这是拳击x,这将导致无论是盒装int 还是空引用...这两者都是由处理string.Concat.

当您没有通过字符串连接转换为字符串时,例如,如果您需要:

int nonNullable = x.Value;
Run Code Online (Sandbox Code Playgroud)

那么你必须使用Value属性-或有明确的转换,也可能是空合并运算符,或打电话GetValueOrDefault:

int nonNullable = (int) x;
int alternative = x ?? 20;
int andAnother = x.GetValueOrDefault(20);
Run Code Online (Sandbox Code Playgroud)

  • 或者可能是x.GetValueOrDefault(20),但是空合并显然很好,不知道这是可能的. (2认同)

And*_*rey 9

xx.Value有不同的类型.

    static void Meth(int i)
    {
        int? x = 5;
        Meth(x);
        Meth(x.Value);
    }
Run Code Online (Sandbox Code Playgroud)

第二行不编译.

因此使用的原因x.Value显而易见 - 您需要在需要实际值时调用它.并且NullReferenceException是合理的,因为null不对应于值类型的值.

  • @Shadow Wizard`(int)x`与`x.Value`相同 (2认同)