C# 如何在我自己的泛型方法中使用Math.Abs?
以下代码不使用编译 。。。无法将T转换为int bla bla bla blaC# 如何在我自己的泛型方法中使用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)
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);
}
...