繁体   English   中英

C# 可空类型和 Value 属性

[英]C# Nullable Types and the Value property

我有点不清楚何时/是否在获取可空类型中包含的值时必须使用可空类型的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 ,则会抛出异常。

通常需要-只是没有你的具体情况。 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);

xx.Value有不同的类型。

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

第二行不编译。

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

如果 HasValue 属性返回 true,您应该访问 Value 属性,否则您将收到异常。 您的示例有效,因为 Nullable 重载了 ToString() 方法,并且 C# 编译器支持此类型的快捷方式。

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

string + null = string :也不例外

如果您想将 .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 + "<-");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM