2011-02-27 31 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