open System
type Point(X : float, Y : float) =
class
member public this.X : float = X
member public this.Y : float = Y
static member public Origin : Point = Point(0.0, 0.0)
static member public (+) (P1 : Point, P2 : Point) : Point =
Point(P1.X+P2.X, P1.Y+P2.Y)
static member public (-) (P1 : Point, P2 : Point) : Point =
Point(P1.X-P2.X, P1.Y-P2.Y)
static member public op_Equality (P1 : Point, P2 : Point) : bool =
P1.X = P2.X && P1.Y = P2.Y
static member public op_Inequality (P1 : Point, P2 : Point) : bool =
P1.X <> P2.X && P1.Y <> P2.Y
override this.ToString() =
String.Format("({0}, {1})", X, Y)
end
我试图重载“=”(等于运算符)和“<>”(不等于运算符),但是通过它们的符号重载相等和不相等运算符-“+”(加法运算符)和“-”(减法运算符)是不允许的。
当我尝试使用它们的符号“=”(等于运算符)和“<>”(不等于运算符)时,我得到了以下消息:
名称“(=)”不应用作成员名称。要为类型定义相等语义,请重写“Object.Equals”成员。如果定义供其他CLI语言使用的静态成员,则应改用名称“op_Equality”。
名称“(<>)”不应用作成员名称。要为类型定义相等语义,请重写“Object.Equals”成员。如果定义供其他CLI语言使用的静态成员,则应改用名称“op_Inquality”。
我按照第二个建议定义了这些运算符作为静态成员。从积极的一面看,没有错误。但是,在条件p1 = Point(1, 0)
和p2 = Point(1, 0)
下,p1 = p2
必须返回true
(在我的程序中返回false
),而p1 <> p2
必须返回false
(在我的程序中返回true
)。
我是F#的新手,不知道如何修正此错误。有人能帮我吗?
Object.Equals
。第二个建议明确表示它仅供其他.NET语言使用。 - Fyodor Soikin