我想做这样的事情,但C#不接受这个:
public static void setPrice(Double? value)
{
if (value != null) {
this.TextBoxPrice.Text = Math.Round(value, 2).ToString();
} else {
this.TextBoxPrice.Text = "No Price";
}
}
Run Code Online (Sandbox Code Playgroud)
那么它是否意味着使用可空类型Double?在这个用例中是完全没用的?那我可以用什么?
更新:我做了一个mystypo我的意思
public static void setPrice(Double? value)
Run Code Online (Sandbox Code Playgroud)
所以我纠正了
Jon*_*eet 16
您当前没有使用可空类型 - 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";
}
}
Run Code Online (Sandbox Code Playgroud)
另一方面,您不应该使用a double来表示财务价值.它不适合作为二进制浮点类型.使用decimal(或decimal?)代替.
(注意Double?相当于Nullable<Double>.)
如果你来自Java背景,你可能期望Double成为一个参考"包装"类型开始 - 它不是.在C#double中只是一个别名System.Double; 他们是同一类型.
Eri*_*ert 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;
}
Run Code Online (Sandbox Code Playgroud)
现在你可以说:
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";
}
Run Code Online (Sandbox Code Playgroud)