扩展方法适用于double和double?类型吗?

5

我正在尝试编写一个扩展方法,可以接受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?不是同一类型,因此需要两个扩展方法,但我确定这可能是一个愚蠢的问题,有没有办法使扩展方法接受多种类型?

你怎么用 double 调用它? - PMerlet
1
它们不是同一类型;你不能只用一个方法来完成它 - Arash
另外需要注意的是,如果你想始终返回一个字符串,你可能会想要返回string.Empty而不是null? - Joel Harkes
1
关于您的编辑:不,除非您将其作为对象的扩展并使用一些丑陋的转换,否则不行。 - CSharpie
6个回答

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;
    }
}

是的,我做过类似的事情,我只是想知道是否有一种方法可以为多个类型创建扩展方法。 - Manish Makkad
1
@ManishMakkad 已经理解,但不幸的是,除非两者之间存在共同的基本类型,否则没有办法。 - lc.
1
@ManishMakkad 当然有,例如 ToFixedScale<T>(Nullable<T> t) 可以适用于无限类型(T 可以是任何可想象的值类型)。但这里重要的思想是,这些类型必须具有一些共性,否则你只能使用 ToFixedScale(object o)。在 Nullable<T>T 的情况下,这种共性是什么?你只能拥有其中之一,两者之间没有共同点。 - InBetween
第二个方法不应该声明为 public static string? ToFixedScale(this double? value) 吗? - Igor Levicki

4

我将编写两个扩展方法,共享一些代码:

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
你有两种不同的类型: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;
    }
}

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);
    }
}

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?,但扩展方法无法获取此隐式转换。因此,你需要提供自己的重载方法。

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();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接