是否可以将通用约束与运算符重载结合起来?
Is possible to combine Generic Constraint with operator overloading?
我想知道是否可以使用通用约束(何时)允许此代码?
这样做的正确模式是什么?
public MyClass<T>
{
public void MyMethod(T a, T b)
{
//some code
var result = a<b;
//some code
}
}
我的问题一般是针对所有运营商的
+, -, !, ~, ++, --, *, /, %, &, |, ^, <<, >>, ==, !=, <, >, <=, >=
这实际上与模式匹配无关。 where
(不是 when
)在这种情况下表示 generic constraints。
不,不可能对操作员施加约束。
您可能想改用自定义界面,在其上添加约束。
public class MyClass<T> where T: ICustomInterface
IComparable
是 >
运算符的一个很好的候选者,但就您希望运算符重载而言,它不适合。
顺便说一句,F# 允许您拥有这样的约束 — 它称为 Member constraints — with use of Statically resolved type parameters。它允许您在任何类型成员或运算符上添加约束。但这不是 CLR 的特性,这可能只是因为丰富的类型推理系统。
此时(2018 年 5 月),您唯一能做的就是在 class 定义中添加对 IComparable<T>
的约束,并使用 CompareTo
方法代替<
。
public class MyClass<T> where T : IComparable<T>
{
public void MyMethod(T a, T b)
{
//some code
var result = a.CompareTo(b) < 0; // a < b
//some code
}
}
这将涵盖 <
、<=
、>
、>=
(技术上甚至是 ==
,但最好使用 IEquatable<T>
),对于 ==
,您可以将 IEquatable<T>
的约束添加到 class 定义,并使用 Equals
方法而不是 ==
(并且!Equals
而不是 !=
)。
对于 math/bitwise 运营商而言,目前没有希望。在 C# 愿望清单中总是有对此功能的请求,但它们总是被推迟。在 C# 8.0 中,此功能将不存在(可能)。有关此问题的旧问题,请参阅 official list of candidates. See Generic C# Code and the Plus Operator。请注意,如果您尝试使用不存在的运算符,给出的解决方案不会在编译时给出错误,但会在运行时给出这些错误。
我想知道是否可以使用通用约束(何时)允许此代码?
这样做的正确模式是什么?
public MyClass<T>
{
public void MyMethod(T a, T b)
{
//some code
var result = a<b;
//some code
}
}
我的问题一般是针对所有运营商的
+, -, !, ~, ++, --, *, /, %, &, |, ^, <<, >>, ==, !=, <, >, <=, >=
这实际上与模式匹配无关。 where
(不是 when
)在这种情况下表示 generic constraints。
不,不可能对操作员施加约束。
您可能想改用自定义界面,在其上添加约束。
public class MyClass<T> where T: ICustomInterface
IComparable
是 >
运算符的一个很好的候选者,但就您希望运算符重载而言,它不适合。
顺便说一句,F# 允许您拥有这样的约束 — 它称为 Member constraints — with use of Statically resolved type parameters。它允许您在任何类型成员或运算符上添加约束。但这不是 CLR 的特性,这可能只是因为丰富的类型推理系统。
此时(2018 年 5 月),您唯一能做的就是在 class 定义中添加对 IComparable<T>
的约束,并使用 CompareTo
方法代替<
。
public class MyClass<T> where T : IComparable<T>
{
public void MyMethod(T a, T b)
{
//some code
var result = a.CompareTo(b) < 0; // a < b
//some code
}
}
这将涵盖 <
、<=
、>
、>=
(技术上甚至是 ==
,但最好使用 IEquatable<T>
),对于 ==
,您可以将 IEquatable<T>
的约束添加到 class 定义,并使用 Equals
方法而不是 ==
(并且!Equals
而不是 !=
)。
对于 math/bitwise 运营商而言,目前没有希望。在 C# 愿望清单中总是有对此功能的请求,但它们总是被推迟。在 C# 8.0 中,此功能将不存在(可能)。有关此问题的旧问题,请参阅 official list of candidates. See Generic C# Code and the Plus Operator。请注意,如果您尝试使用不存在的运算符,给出的解决方案不会在编译时给出错误,但会在运行时给出这些错误。