我正在尝试编写一个接受double
和double?
的扩展方法。
public static class ExtensionMethod
{
public static string ToFixedScale(this double? value)
{
return value.HasValue ? (Math.Truncate(value.Value * 100) / 100).ToString("0.00") : null;
}
}
它适用于dobule?
,但它不适用于double
。有没有办法可以将此扩展方法用于double和double?。
编辑:因为所有用户建议有两个扩展方法为double和double?不是同一类型,我相信这可能是一个愚蠢的问题,但有一种方法,扩展方法接受多种类型?
答案 0 :(得分:8)
Nullable<double>
和double
是两种不同的类型。虽然这些类型之间确实存在隐式转换,但其他类型的扩展方法将无法找到。您需要使用接受double
参数的版本重载您的方法:
public static class ExtensionMethod
{
public static string ToFixedScale(this double value)
{
return Math.Truncate(value * 100) / 100).ToString("0.00");
}
public static string ToFixedScale(this double? value)
{
return value.HasValue ? ToFixedScale(value.Value) : null;
}
}
答案 1 :(得分:3)
您有两个不同类型:double
和Nullable<double>
;这就是为什么你必须实现两个扩展方法的原因:
public static class ExtensionMethod
{
public static string ToFixedScale(this double value) {
return (Math.Truncate(value * 100) / 100).ToString("0.00");
}
public static string ToFixedScale(this double? value)
{
return value.HasValue ? ToFixedScale(value.Value) : null;
}
}
答案 2 :(得分:3)
我会写两个扩展方法共享一些代码:
public static class ExtensionMethods
{
public static string ToFixedScale(this double? value)
{
return value.HasValue ? value.Value.ToFixedScale() : null;
}
public static string ToFixedScale(this double value)
{
return (Math.Truncate(value.Value * 100) / 100).ToString("0.00");
}
}
答案 3 :(得分:1)
编写第二种方法来使用第一种方法:
public static class ExtensionMethod
{
public static string ToFixedScale(this double? value)
{
return value.HasValue ? (Math.Truncate(value.Value * 100) / 100).ToString("0.00") : null;
}
public static string ToFixedScale(this double value)
{
return ToFixedScale((double?)value);
}
}
答案 4 :(得分:1)
您可以简单地重载扩展方法:
public static class ExtensionMethod
{
public static string ToFixedScale(this double value) {
return ToFixedScale((double?)value);
}
public static string ToFixedScale(this double? value)
{
return value.HasValue ? (Math.Truncate(value.Value * 100) / 100).ToString("0.00") : null;
}
}
您的问题是,当double
隐式转换为double?
时,扩展方法不会获得此隐式转换。所以你必须提供自己的重载。
答案 5 :(得分:0)
只需为double
public static string ToFixedScale(this double value)
{
return (Math.Truncate(value * 100) / 100).ToString("0.00");
}
对于double?
,您可以这样称呼它:
double? x = null;
string s = x?.ToFixedScale();