2

我正在尝试创建一个实现我自己的类“Stellungen”的通用 IComparer 的类(它转换为位置,例如在国际象棋或跳棋板上)。

这就是我得到的:

Private Class comparer(Of Stellung)
    Implements System.Collections.Generic.IComparer(Of Stellung)

    Public Function Compare(x As Stellung, y As Stellung) As Integer Implements System.Collections.Generic.IComparer(Of Stellung).Compare

    End Function

End Class

问题是:在函数内部,我无法访问班级的任何字段。如果我从 x 开始。Intellisense 只会给我 .Equals、.GetHashCode - 你在类型上而不是在实例上获得的方法。Visual Studio 10 也强调了这一点,在函数的定义中,位“x as Stellung”和“y as Stellung”用浅蓝色书写,表示它是一种类型,而不是实际对象。

所以……我该怎么办??我如何访问我想在课堂上比较的东西?谢谢!

4

2 回答 2

2

这些字段可能是私有的,这就是您无法访问它们的原因。让你的类实现IComparable<T>接口。您可以在比较器类中使用它。
下面是一个通用比较器类的示例,该类比较实现了IComparable<T>.

Public Class GenericComparer(Of T As IComparable(Of T))
    Inherits Comparer(Of T)

    Public Overrides Function [Compare](ByVal x As T, ByVal y As T) As Integer
        If (Not x Is Nothing) Then
            If (Not y Is Nothing) Then
                Return x.CompareTo(y)
            End If
            Return 1
        End If
        If (Not y Is Nothing) Then
            Return -1
        End If
        Return 0
    End Function

    Public Overrides Function Equals(ByVal obj As Object) As Boolean
        Dim comparer As GenericComparer(Of T) = TryCast(obj,GenericComparer(Of T))
        Return (Not comparer Is Nothing)
    End Function

    Public Overrides Function GetHashCode() As Integer
        Return MyBase.GetType.Name.GetHashCode
    End Function

End Class


public class Stellung
   Implements IComparable(Of Stellung)

   Public Function CompareTo(ByVal value As Stellung) As Integer
       'Here you should be able to access all fields. 
   End Function
End class
于 2012-06-17T09:08:22.980 回答
1

如果您声明Private Class comparer(Of Stellung),则“Stellung”只是要使用的类型的占位符(如教程中的“T”)。

声明Private Class comparer,并Implements System.Collections.Generic.IComparer(Of Stellung)告诉编译器您要比较“Stellung”类型的对象,顺便说一句,这使得 Stellung 的属性在编辑器中可见。

于 2018-09-20T10:30:56.107 回答