.net - 调用泛型函数(通过接口实现约束)会产生关于缺少约束的错误。我看不到什么?
问题描述
我想在我的泛型类中做一些算术加法,并有一些约束。为简洁起见,假设只有一个名为 的公共成员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
onC
是必需的,否则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)
.
我想念什么?
解决方案
第 1 部分:
正如@Gserg 评论的那样:
GenericInterval
不强制 T 为Int64
。因此,在Int64Calculator
测试有效性时,需要将任何 T 处理为{Structure, IComparable}
,而不仅仅是Int64
。您可以使用 修复该问题lCompHash = Me.Add(Of Int64, Int64Calculator)(Me.Value, HASHPRIME_1)
,但随后您将遇到另一个关于 Me.Value 不一定可转换为的错误Int64
。
第 2 部分:
在您根据某些属性认为对象相等的情况下,实现 GetHashCode 的最简单方法是使用Tuple.Create(x,y).GetHashCode()
例如,如果您认为具有相同Name
和PhoneNumber
属性的属性相等,则以下代码将返回一个可用的 HashCode。
public override int GetHashCode() { return Tuple.Create(Name, PhoneNumber).GetHashCode(); }
推荐阅读
- python-3.x - if not img==None: ValueError: 具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()
- rust - 我可以从 Clap 的 arg 解析器中获得静态生命周期吗?
- scala - 在 WindowedStream 中查找 Top K 元素 - Flink
- c# - 从 Debug 切换到 Release 配置时未解决的引用
- python - Fuseki 服务器在哪里存储三重数据?
- r - 如何同时使用 geom_line 和 geom_point 更改图例形状?
- javascript - 有没有办法在传单地图上编辑现有的 geojson 数据
- android - 如何从 chrome 自定义选项卡 Android 启动新会话或 INCOGNITO_TAB 模式
- php - 如何使用 PHP 将 csv 文件导入 sqlite 数据?过程是什么?
- c# - 使用 C# 获取活动目录用户数据