Я хочу сделать некоторое арифметическое добавление в моем родовом классе с некоторыми ограничениями. Для краткости предположим, что существует только один публичный член с именем Value
.
Public MustInherit Class GenericInterval(Of T As {Structure, IComparable})
Public Value As T
'(1) filled in below
End Class
Вне класса у меня есть интерфейс и структура, реализующая его следующим образом:
Public Interface IAddable(Of U As {Structure, IComparable})
Function Add(a As U, b As U) As U
End Interface
Public Structure Int64Calculator
Implements IAddable(Of Int64)
Public Function Add(ByVal a As Int64, ByVal b As Int64) As Int64 _
Implements IAddable(Of Int64).Add
Return a + b
End Function
End Structure
Это позволяет мне создать функцию в моем классе в позиции, отмеченной (1) выше. Есть некоторые ограничения, но, насколько я могу судить, я думаю, что правильно понял эту часть. New
на C
необходимо, иначе As C = New C()
было бы невозможно.
Public MustInherit Class GenericInterval(Of T As {Structure, IComparable})
Public Value As T
'(2) filled in below
Private Function Add(Of U As {Structure, IComparable},
C As {IAddable(Of U), New}) _
(ByVal a As U, ByVal b As U) As U
Dim calc As C = New C()
Return calc.Add(a, b)
End Function
End Class
Теперь я намеревался использовать эту функцию для выполнения вычислений в переопределенной функции класса GetHashCode
следующим образом:
Public MustInherit Class GenericInterval(Of T As {Structure, IComparable})
Public Value As T
Public Overrides Function GetHashCode() As Integer
Const HASHPRIME_1 As Int64 = 4294967291 '32 bits.
Dim lCompHash As Int64 'Partial hash for actual component.
lCompHash = Add(Of T, Int64Calculator)(Value, HASHPRIME_1)
End Function
'... as above
End Class
Тем не менее, VS жалуется с ошибкой BC32044 , волнисто подчеркивает, ссылаясь на
Add(Of T, Int64Calculator)
с указанием
"Аргумент типа 'Int64Calculator' не наследуется и не реализует
тип ограничения 'IAddable (Of T As {Structure, IComparable})' ".
Только то, что я думаю, что структура Int64Calculator
действительно реализует это ограничение через Implements IAddable(Of Int64)
.
Что мне не хватает?