双重和双重的扩展方法?

时间:2016-12-21 07:45:27

标签: c#

我正在尝试编写一个接受doubledouble?的扩展方法。

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?不是同一类型,我相信这可能是一个愚蠢的问题,但有一种方法,扩展方法接受多种类型?

6 个答案:

答案 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)

您有两个不同类型:doubleNullable<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();