.ToString()不会在double上引发异常?还是长的?虽然它会在空字符串

时间:2015-07-27 14:26:42

标签: c# asp.net .net asp.net-mvc asp.net-mvc-5

我有三个属性如下: -

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?,我可以解释为什么if (airPlanePlayerRigidbody2D.velocity.y < 0) { //falling var myNewQuaternion = Quaternion.Euler (new Vector3 (0, 0, -30)); var myQuaternion = Quaternion.Euler(new Vector3(transform.rotation.eulerAngles.x, transform.rotation.eulerAngles.y, transform.rotation.eulerAngles.z)); transform.rotation = Quaternion.Slerp (myQuaternion , myNewQuaternion , speed ); } else if (airPlanePlayerRigidbody2D.velocity.y > 0) { // rising var myNewQuaternion = Quaternion.Euler (new Vector3 (0, 0, 30)); var myQuaternion = Quaternion.Euler(new Vector3(transform.rotation.eulerAngles.x, transform.rotation.eulerAngles.y, transform.rotation.eulerAngles.z)); transform.rotation = Quaternion.Slerp (myQuaternion , myNewQuaternion , speed ); } 不会引发异常var customers = testing(); foreach (CustomerMain customer in customers) { // access customer.FirstName } 包含字符串的空值,但只有在字符串为空时才会引发空引用异常?

3 个答案:

答案 0 :(得分:7)

简化它:

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

此处null不是引用。它只是int?类型的空值,即类型Nullable<int>的值HasValue为假。

您只是在该值上调用Nullable<T>.ToString()方法。不涉及空引用,因此没有NullReferenceException。该行为记录为:

  

如果Nullable<T>属性为true,则为当前HasValue对象的值的文本表示形式;如果为HasValue,则为空字符串(&#34;&#34;)财产是假的。

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

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

请注意,这只适用于编译时类型是可以为空的类型。

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

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

MSDN Help对此非常明确。

  

当前Nullable对象的值的文本表示   如果HasValue属性为true,或者为空字符串(“”)如果为   HasValue属性为false。