我想做这样的事情,但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)
所以我纠正了。
答案 0 :(得分: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
的别名;他们是同一类型。
答案 1 :(得分: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";
}
答案 2 :(得分:1)
我同意Jon Skeet的回答,并且只是想在这个特定情况下添加,你可以考虑简单地添加一个ClearPrice方法 - 出于更清晰的API +避免if-else的原因。