【问题标题】:How do I properly write Math extension methods for int, double, float, etc.?如何正确编写 int、double、float 等的数学扩展方法?
【发布时间】:2017-09-29 22:36:11
【问题描述】:

我想写一系列扩展方法来简化数学运算。例如:

代替

Math.Pow(2, 5)

我希望能够写作

2.Power(5) 

这(在我看来)更清晰。

问题是:在写扩展方法的时候如何处理不同的数值类型?是否需要为每种类型写一个扩展方法:

public static double Power(this double number, double power) {
    return Math.Pow(number, power);
}
public static double Power(this int number, double power) {
    return Math.Pow(number, power);
}
public static double Power(this float number, double power) {
    return Math.Pow(number, power);
}

或者有什么技巧可以让单个扩展方法适用于任何数字类型?

谢谢!

【问题讨论】:

  • +1 是的,我很惊讶这不是框架的一部分。
  • 警告 使用此类扩展方法时:-10.Power(2) == -100。减号应用于10.Power(2) 的结果。
  • @HugoRune:有趣的一点!但我确实认为 OP 仍然会使用变量而不是显式值。问题中的硬编码值似乎是一个示例问题,而不是预期用途。

标签: c# extension-methods


【解决方案1】:

不幸的是,我认为您被这三种实现方式所困扰。从单个定义中获取多个类型化方法的唯一方法是使用泛型,但不可能编写一个泛型方法来专门为数字类型做一些有用的事情。

【讨论】:

    【解决方案2】:

    您只需要覆盖 Decimal 和 Double,如本问题所述:here

    【讨论】:

      【解决方案3】:

      我使用的一种解决方案是对对象进行扩展。这使这成为可能,但不幸的是它会在所有对象上可见。

      public static double Power(this object number, double power) 
      {
          return Math.Pow((double) number, power);
      }
      

      【讨论】:

        【解决方案4】:

        我认为 C# 3.0 不可能。看起来你可能能够做到 C# 4.0

        http://blogs.msdn.com/lucabol/archive/2009/02/05/simulating-inumeric-with-dynamic-in-c-4-0.aspx

        【讨论】:

        • 好点...不过,我不确定在一般情况下,性能损失是否物有所值。
        • 链接的文章没有像设计的那样使用动态,我认为为了舒适而交易类型安全不是正确的方式
        猜你喜欢
        • 1970-01-01
        • 2020-12-18
        • 1970-01-01
        • 2018-02-23
        • 1970-01-01
        • 2021-04-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多