以下代码无法使用
进行编译...无法将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
?
答案 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);
}
...