十进制和&之间的扩展和冲突双

时间:2010-02-12 01:44:19

标签: c#

我不确定这只是我,但这看起来有点奇怪。我在静态类中有一些扩展用于舍入值:

    public static double? Round(this double? d, int decimals)
    {
        if (d.HasValue)
            return Math.Round(d.Value, decimals, MidpointRounding.AwayFromZero);
        return null;
    }
    public static double? Round(this double d, int decimals)
    {
        return Math.Round(d, decimals, MidpointRounding.AwayFromZero);
    }

我最近为舍入小数添加了相同的内容:

    public static decimal? Round(this decimal? d, int decimals)
    {
        if (d.HasValue)
            return Math.Round(d.Value, decimals, MidpointRounding.AwayFromZero);
        return null;
    }
    public static decimal? Round(this decimal d, int decimals)
    {
        return Math.Round(d, decimals, MidpointRounding.AwayFromZero);
    }

我希望在这一点上没有人能看到任何错误。当我有代码

时出现
        var x = (decimal)0;
        var xx = x.Round(0);

CLR抛出错误成员'decimal.Round(decimal)'无法使用实例引用访问;使用类型名称对其进行限定

WTF?如果我只是重命名我的十进制舍入扩展(例如称之为RoundDecimal),一切正常。似乎CLR在某种程度上混淆了双重和十进制方法..任何人都可以解释这个吗?

有趣的是,如果我改为调用Round(x,0),它可以正常工作......

1 个答案:

答案 0 :(得分:3)

致电时:

var xx = x.Round(0);

编译器将此视为对Decimal.Round的调用,这是一个错误,因为它是静态的。

我强烈建议您使用与框架的“Round”方法不同的方法名称。例如,在您的情况下,我建议使用RoundAwayFromZero。如果你这样做,你可以这样做:

var xx = x.RoundAwayFromZero(0);