IDictionary.Item返回错误的类型

时间:2013-12-07 18:37:45

标签: .net vb.net

我对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。我有点困惑,我怎么能让它正常工作?非常感谢帮助。

2 个答案:

答案 0 :(得分:0)

double是“值类型”(而不是常见的“引用类型”)。这意味着它不能是Nothing,当你期望它是Nothing时,它实际上是它的默认值(在double中是0.0)。

对于所有基本类型(int,long,char ...)和结构类型也是如此。

答案 1 :(得分:0)

如果字典包含NothingNothing的可空类型的值类型甚至引用类型,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,如果可用,则返回找到的项目。