如何在我自己的泛型方法中使用Math.Abs​​?

时间:2014-02-28 07:18:56

标签: c#

以下代码无法使用

进行编译
  

...无法将T转换为int bla bla bla

bool IsEqual<T>(this T a, T b, T offset)
{
    a = Math.Abs(a);
    b = Math.Abs(b);
    if (Math.Abs(a - b) < offset)
        return true;
    else
        return false;
}

如何在我自己的通用方法中使用Math.Abs

2 个答案:

答案 0 :(得分:1)

你做不到。在你的方法中,类型参数T可以是任何东西,字符串,类,你可以命名它。

Math.Abs仅适用于一小组参数类型。如果您可以约束T,那将会很好,但这也是不可能的。

这意味着如果您需要IsEqual方法来处理不同类型的T,则必须手动为它们编写重载:

bool IsEquals(int a, int b, int offset) { }
bool IsEquals(double a, double b, double offset) { }
// and many more

答案 1 :(得分:1)

如果只有.Net在 Java 中有接口,如数字,你可能会放点东西像

 // Doesn't compile; just the idea
 bool IsEqual<T>(this T a, T b, T offset) 
   where T: Number { // <- T can be any integer or floating point type 
     a = Math.Abs(a);
     ....

不幸的是,.Net 没有提供这样的界面,所以你必须实现IsEqual重载版本

  bool IsEqual(this Double a, Double b, Double offset) {
    return (Math.Abs(a - b) < offset);
  }

  bool IsEqual(this Single a, Single b, Single offset) {
    return (Math.Abs(a - b) < offset); 
  }

  bool IsEqual(this long a, long b, long offset) {
    return (Math.Abs(a - b) < offset);
  }

  bool IsEqual(this int a, int b, int offset) {
    return (Math.Abs(a - b) < offset);
  }
  ...