2011-02-27 57 views
2

我想要做這樣的事情可空類型與Math.Round但C#不接受這一點:如何使用Double?在.NET

public static void setPrice(Double? value) 
    { 

     if (value != null) { 
      this.TextBoxPrice.Text = Math.Round(value, 2).ToString(); 
     } else { 
      this.TextBoxPrice.Text = "No Price"; 
     } 

    } 

那麼是否意味着使用可空類型雙?在這個用例中完全沒用?我可以使用什麼?

更新:我做了一個mystypo我其實是

public static void setPrice(Double? value) 

所以我糾正。

回答

16

您當前未使用可爲空的類型 - Double是非空值類型,因此不能爲空。這是你想要什麼:

public static void setPrice(Double? value) 
{ 

    if (value != null) { 
     this.TextBoxPrice.Text = Math.Round(value.Value, 2).ToString(); 
    } else { 
     this.TextBoxPrice.Text = "No Price"; 
    } 
} 

在另一方面,你應該被使用double表示財務價值。它不適合作爲二進制浮點類型。改用decimal(或decimal?)。

(注意:Double?相當於Nullable<Double>

如果你來自一個Java的背景下,你可能會希望Double做個參考「包裝」類型入手 - 這不是。在C#中double只是System.Double的別名;它們是同一類型的。

+0

我做了一個mystypo我實際使用雙?所以我的代碼和你的代碼一樣,並且不起作用。 – user310291 2011-02-27 13:33:26

+1

@user你錯過了Jon在將'double?'傳遞給'Math.Round'時插入了'.Value'。這就修復了你的代碼,因爲它將'double?'轉換爲'double'。 'Math.Round'期望'double',但不'double'。 – CodesInChaos 2011-02-27 13:35:26

+0

@CodeInChaos啊是的,我錯過了這個謝謝:) – user310291 2011-02-27 14:35:11

1

我同意Jon Skeet的回答,只是想補充一點,在這種情況下,您可能會考慮簡單地添加一個ClearPrice方法 - 出於更清楚的API +避免if-else的原因。

13

Jon的答案很好 - 特別注意關於小數點的位 - 但我想我會補充說,您可以使用高階編程「提升」方法爲空。例如:

public static Func<T?, T?> Lift<T>(Func<T, T> func) where T : struct 
{ 
    return (T? t)=>t.HasValue ? (T?)func(t.Value) : (T?)null; 
} 

public static Func<A?, R> LiftRef<A, R>(Func<A, R> func) where A : struct where R : class 
{ 
    return (A? a)=>a.HasValue ? func(a.Value) : null; 
} 

現在你可以說:

Func<decimal, decimal> round2 = x=>Math.Round(x, 2); 
Func<decimal?, decimal?> liftedRound2 = Lift(round2); 
Func<decimal?, string> liftedToString = LiftRef(decimal.ToString); 
... 

public static void SetPrice(decimal? value) 
{ 
    this.TextBoxPrice.Text == liftedToString(liftedRound2(value)) ?? "No Price"; 
} 
+0

非常感謝你看起來很有趣:) – user310291 2011-02-28 16:32:11

+1

我可以用這個作爲最短代碼中最多問號的例子。 – 2011-02-28 20:42:50

+0

只是讓我大開眼界的神祕廢話......-P – Alxandr 2011-03-06 20:09:50