Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在我自己的泛型方法中使用Math.Abs?_C# - Fatal编程技术网

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

C# 如何在我自己的泛型方法中使用Math.Abs?,c#,C#,以下代码不使用编译 。。。无法将T转换为int bla bla bla bla bool IsEqual(此T a、T b、T偏移) { a=数学Abs(a); b=数学Abs(b); if(数学绝对值(a-b)

以下代码不使用编译

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

bool IsEqual(此T a、T b、T偏移)
{
a=数学Abs(a);
b=数学Abs(b);
if(数学绝对值(a-b)<偏移量)
返回true;
其他的
返回false;
}

如何在我自己的通用方法中使用
Math.Abs
。在您的方法中,类型参数
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
如果.Net在Java中只有类或接口,如Number,那么您很可能会将

 // 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);
     ....

你不能。您只需要为
Math.Abs
实际支持的类型(或您想要使用的较小类型子集)提供一组重载和一些非常重复的代码,我们可以在这里使用扩展方法吗?当然,您可以使用扩展方法,但这并不能解决问题。@后一个问题是,无论是否使用扩展方法,都必须将t约束到某个东西或数学上。Abs(a)不会编译,但该约束根本不可能,因为C规范不允许。约束还必须包括
操作符-
存在于
T
上。
 // 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);
     ....
  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);
  }
  ...