我对IDictionary.Item返回类型有疑问。这是代码:
Class SomeClass Implements IComparer(Of C)
Private ReadOnly cache As IDictionary = New Dictionary(Of C, T)
Public Function compare(ByVal chr1 As C, ByVal chr2 As C) As Integer Implements IComparer(Of C).Compare
Dim fit1 As T = Me.fit(chr1)
Dim fit2 As T = Me.fit(chr2)
Dim ret As Integer = fit1.CompareTo(fit2)
Return ret
End Function
Public Overridable Function fit(ByVal chr As C) As T
Dim fits As T = Me.cache.Item(chr) '<----- Here it fails
If fits Is Nothing Then '<------ False, because fits == 0.0
fits = fitnessFunc.calculate(chr)
Me.cache.Add(chr, fits)
End If
Return fits
End Function
End Class
我的cache
为空。 MSDN说IDictionary.Item
返回具有指定键的元素,如果键不存在则返回Nothing
。但是,我的fits
类型为Double
,并且由于未知原因等于0.0
,但必须为Nothing
。我有点困惑,我怎么能让它正常工作?非常感谢帮助。
答案 0 :(得分:0)
double是“值类型”(而不是常见的“引用类型”)。这意味着它不能是Nothing,当你期望它是Nothing时,它实际上是它的默认值(在double中是0.0)。
对于所有基本类型(int,long,char ...)和结构类型也是如此。
答案 1 :(得分:0)
如果字典包含Nothing
或Nothing
的可空类型的值类型甚至引用类型,IDictionary.Item
无法告诉您是否在缓存中找到了某个项目或者是否只返回了类型的默认值,因为找不到密钥。
更好地使用字典的TryGetValue
方法:
Dim fits As T
If cache.TryGetValue(chr, fits) Then
' We found an item in the cache
Else
' We must calculate the missing item and add it to the cache
End If
注意:TryGetValue
的第二个参数是ByRef
,如果可用,则返回找到的项目。