【问题标题】:Is there an interface that enables > < and all the other comparison operators?是否有启用 > < 和所有其他比较运算符的界面?
【发布时间】:2012-12-21 12:56:27
【问题描述】:

我正在做一个泛型类,一直以来我都在考虑使用实现IComparable 的类型,使用比较运算符启用。

我知道.CompareTo()可以在功能上执行相同的操作,但我有一种唠叨的感觉,必须有一个实现比较运算符的接口。

【问题讨论】:

    标签: .net vb.net interface operator-overloading syntactic-sugar


    【解决方案1】:

    这不是通过实现接口,而是通过operator overloading 完成。因此,要重载大于和小于比较运算符,例如,您可以执行以下操作:

    Public Class MyNumber
        Public Value As Integer
    
        Public Overloads Shared Operator >(ByVal x As MyNumber, ByVal y As MyNumber) As Boolean
            Return (x.Value > y.Value)
        End Operator
    
        Public Overloads Shared Operator <(ByVal x As MyNumber, ByVal y As MyNumber) As Boolean
            Return (x.Value < y.Value)
        End Operator
    End Class
    

    由于运算符重载被定义为Shared,它们不能由接口声明。 VB.NET 中的接口只能声明实例成员。他们不能声明共享成员。

    【讨论】:

    • 这是一个很好的提示,但重载运算符并不是一个解决方案,因为我正在使用泛型。我没有意识到 static / Shared 函数不能成为接口的一部分,很高兴知道。
    • @j.i.h.如果是这样的话,这就是IComparable 之类的接口的用途。这就是它们存在的原因。不幸的是,您只是通过界面进行了比较操作。
    • 很遗憾,您不能根据泛型类型支持的运算符来限制它们。
    【解决方案2】:

    没有。不能通过接口指定运算符。

    Interfaces 定义类可以实现的属性、方法和事件[但不是运算符]。

    如前所述,最近的接口是IComparable。

    有些语言有更多的糖映射(例如 Scala),但没有 VB.NET 或 C#。

    【讨论】:

    • 这一缺陷尤其令人沮丧,因为 IComparable.CompareTo 方法在某些边缘情况下的行为与 &lt;、&gt; 和 == 运算符不同,例如涉及 @ 的比较987654326@.
    猜你喜欢
    • 2020-06-26
    • 2014-07-31
    • 1970-01-01
    • 1970-01-01
    • 2011-01-16
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    • 2015-07-03
    相关资源
    最近更新 更多