.ToString()不会引发double类型的异常?或长时间?虽然它会在空字符串上引发异常

本文关键字:异常 字符串 长时间 double 类型 ToString | 更新日期: 2023-09-27 18:04:49

我有以下三个属性:-

public Nullable<double> SPEED { get; set; }
public Nullable<Int64> PROCESSORCOUNT { get; set; }
public string CPUNAME { get; set; }

现在在我的asp.net mvc5 web应用程序的控制器类中,如果我为上述三个变量传递null,如下所示:

query["proSpeed"] = sj.SPEED.ToString();
query["proCores"] = sj.PROCESSORCOUNT.ToString();
query["proType"] = sj.CPUNAME.ToString();

那么toString()只会在空字符串上引发异常,主要是sj.CPUNAME.ToString();,所以有人能告诉为什么ToString()不会引发异常,如果我试图将包含空值的double?long?转换为字符串,但它只会在字符串为空时引发空引用异常吗?

.ToString()不会引发double类型的异常?或长时间?虽然它会在空字符串上引发异常

简化一下:

int? x = null;
string result = x.ToString(); // No exception

这里null不是空引用。它只是一个int?类型的空值,即Nullable<int>类型的值,其中HasValue为假。

你只是在那个值上调用Nullable<T>.ToString()方法。没有null引用,所以没有NullReferenceException。该行为被记录为:

如果HasValue属性为真,则当前Nullable<T>对象的值的文本表示形式;如果HasValue属性为假,则为空字符串(")。

换句话说,它可以有效地实现为:

return HasValue ? Value.ToString() : "";

注意,这只在编译时类型是可空类型时才有效。

如果你最终装箱一个空值,你最终会得到一个空引用:

object y = x;               // Oh noes, now y is a null reference...
string bang = y.ToString(); // so this throws!

Nullable<T>本身不能为空,但它的值可以。例如,您可以将其ToString方法实现为:

public string override ToString()
{
     if (this.HasValue) return this.Value;
     else return string.Empty;
}

您不能对string做同样的事情,因此,如果字符串为空,则会引发NullReferenceException

MSDN帮助对此非常清楚。

当前Nullable对象值的文本表示形式如果HasValue属性为真,则为空字符串(")HasValue属性为false