怎么用Double? 在.NET中使用Math.Round的可空类型

我想做这样的事情,但C#不接受这个:

public static void setPrice(Double? value) { if (value != null) { this.TextBoxPrice.Text = Math.Round(value, 2).ToString(); } else { this.TextBoxPrice.Text = "No Price"; } } 

那么它是否意味着使用可空类型Double? 在这个用例中是完全没用的? 那我可以用什么?

更新:我做了一个mystypo我的意思

  public static void setPrice(Double? value) 

所以我纠正了。

您当前没有使用可空类型 – Double是不可为空的值类型,因此永远不能为null。 这就是你想要的:

 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 。)

如果您来自Java背景,那么您可能期望Double可以作为参考“包装”类型开始 – 它不是。 在C#中, double只是System.Double的别名; 他们是同一类型。

Jon的答案很好 – 特别注意关于小数的一点 – 但我想我会补充说你可以使用高阶编程将“提升”方法变为可空。 例如:

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

现在你可以说:

 Func round2 = x=>Math.Round(x, 2); Func liftedRound2 = Lift(round2); Func liftedToString = LiftRef(decimal.ToString); ... public static void SetPrice(decimal? value) { this.TextBoxPrice.Text == liftedToString(liftedRound2(value)) ?? "No Price"; } 

我同意Jon Skeet的回答,并且只想补充一点,在特定情况下,您可以考虑简单地添加一个ClearPrice方法 – 出于更清晰的API +避免if-else的原因。