2010-02-12 55 views
0

我不确定它是否只是我,但这似乎有点不可思议。我有一个静态类中的一些扩展舍入值:扩展和十进制和双之间的冲突

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(十进制)”不能以一个实例引用来访问它出现;用类型名称代替它

WTF?如果我只是重命名我的小数四舍五入扩展(例如称为RoundDecimal),一切工作正常。似乎CLR不知何故混淆了双精度和十进制方法..任何人都可以解释这一点吗?

有趣的是,如果我叫圆(X,0)代替,它工作正常...

回答

3

当你拨打:

var xx = x.Round(0); 

编译器认为这是给Decimal.Round一个电话,这是一个错误,因为它是一个静态的。

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

var xx = x.RoundAwayFromZero(0);