[英]implementing IDictionary interface in vb.net
我正在嘗試在VB.net中實現IDictionary接口,但出現錯誤。 請同樣幫我。
Imports System.Collections.Generic
Public Class DataDictionary Implements IDictionary(Of String, Object)
Private _ce As CalcEngine.CalcEngine
Private _dct As Dictionary(Of String, Object)
Public Sub New(ByVal ce As CalcEngine.CalcEngine)
_ce = ce
_dct = New Dictionary(Of String, Object)()
End Sub
#Region "IDictionary<string,object> Members"
Public Sub Add(ByVal key As String, ByVal value As Object) Implements Collections.Generic.IDictionary(Of String, Object).Add
_dct.Add(key, value)
End Sub
Public Function ContainsKey(ByVal key As String) As Boolean Implements System.Collections.Generic.IDictionary(Of String, Object).ContainsKey
Return _dct.ContainsKey(key)
End Function
Public ReadOnly Property Keys() As ICollection(Of String) Implements System.Collections.Generic.IDictionary(Of String, Object).Keys
Get
Return _dct.Keys
End Get
End Property
Public Function Remove(ByVal key As String) As Boolean Implements System.Collections.Generic.IDictionary(Of String, Object).Remove
Return _dct.Remove(key)
End Function
Public ReadOnly Property Values() As ICollection(Of Object) Implements System.Collections.Generic.IDictionary(Of String, Object).Values
Get
Return _dct.Values
End Get
End Property
Public Function TryGetValue(ByVal key As String, ByRef value As Object) As Boolean Implements System.Collections.Generic.IDictionary(Of String, Object).TryGetValue
If _dct.TryGetValue(key, value) Then
Dim expr = TryCast(value, String)
If expr IsNot Nothing AndAlso expr.Length > 0 AndAlso expr(0) = "="c Then
value = _ce.Evaluate(expr.Substring(1))
End If
Return True
End If
Return False
End Function
Default Public Property Item(ByVal key As String) As Object Implements System.Collections.Generic.IDictionary(Of String, Object).Item
Get
Dim value As Object
If TryGetValue(key, value) Then
Return value
End If
Throw New Exception("invalid index")
End Get
Set(ByVal value As Object)
_dct(key) = value
End Set
End Property
#End Region
#Region "ICollection<KeyValuePair<string,object>> Members"
Public Sub Add(ByVal item As KeyValuePair(Of String, Object)) Implements System.Collections.Generic.ICollection(Of KeyValuePair(Of String, Object)).Add
Dim d = TryCast(_dct, ICollection(Of KeyValuePair(Of String, Object)))
d.Add(item)
End Sub
Public Sub Clear() Implements System.Collections.Generic.ICollection(Of KeyValuePair(Of String, Object)).Clear
_dct.Clear()
End Sub
Public Function Contains(ByVal item As KeyValuePair(Of String, Object)) As Boolean Implements System.Collections.Generic.ICollection(Of KeyValuePair(Of String, Object)).Contains
Dim d = TryCast(_dct, ICollection(Of KeyValuePair(Of String, Object)))
Return d.Contains(item)
End Function
Public Sub CopyTo(ByVal array As KeyValuePair(Of String, Object)(), ByVal arrayIndex As Integer) Implements System.Collections.Generic.ICollection(Of KeyValuePair(Of String, Object)).CopyTo
Dim d = TryCast(_dct, ICollection(Of KeyValuePair(Of String, Object)))
d.CopyTo(array, arrayIndex)
End Sub
Public ReadOnly Property Count() As Integer Implements System.Collections.Generic.ICollection(Of KeyValuePair(Of String, Object)).Count
Get
Return _dct.Count
End Get
End Property
Public ReadOnly Property IsReadOnly() As Boolean Implements System.Collections.Generic.ICollection(Of KeyValuePair(Of String, Object)).IsReadOnly
Get
Return False
End Get
End Property
Public Function Remove(ByVal item As KeyValuePair(Of String, Object)) As Boolean Implements System.Collections.Generic.ICollection(Of KeyValuePair(Of String, Object)).Remove
Dim d = TryCast(_dct, ICollection(Of KeyValuePair(Of String, Object)))
Return d.Remove(item)
End Function
#End Region
#Region "IEnumerable<KeyValuePair<string,object>> Members"
Public Function GetEnumerator() As IEnumerator(Of KeyValuePair(Of String, Object)) Implements IEnumerable(Of KeyValuePair(Of String, Object)).GetEnumerator
Return TryCast(_dct.GetEnumerator(), IEnumerator(Of KeyValuePair(Of String, Object)))
End Function
#End Region
#Region "IEnumerable Members"
Private Function GetEnumerator() As System.Collections.IEnumerator Implements System.Collections.IEnumerable.GetEnumerator
Return TryCast(_dct.GetEnumerator(), System.Collections.IEnumerator)
End Function
#End Region
End Class
當我編譯時出現以下錯誤:
錯誤1類'DataDictionary'必須為接口'System.Collections.Generic.IEnumerable(Of System.Collections.Generic.KeyValuePair(Of String,Object)實現'Function GetEnumerator()As IEnumerator(Of KeyValuePair(Of String,Object))' ))'。 H:\\ Test \\ WindowsApplication1 \\ WindowsApplication1 \\ ProbeDataDictionary.vb 4 16 WindowsApplication1
錯誤3'公共函數GetEnumerator()作為System.Collections.Generic.IEnumerator(Of System.Collections.Generic.KeyValuePair(字符串,對象))'和'私有函數GetEnumerator()作為System.Collections.IEnumerator'無法重載其他,因為它們僅在返回類型上有所不同。 H:\\ Test \\ WindowsApplication1 \\ WindowsApplication1 \\ ProbeDataDictionary.vb 96 21 WindowsApplication1
提前致謝。
您已經錯過了一種GetEnumerator
方法的接口實現聲明:
Public Function GetEnumerator() As IEnumerator(Of KeyValuePair(Of String, Object))
應該
Public Function GetEnumerator() As IEnumerator(Of KeyValuePair(Of String, Object)) Implements IEnumerable(Of KeyValuePair(Of String, Object)).GetEnumerator
更新資料
好的,您的方法應如下所示:
Public Function GetEnumeratorGeneric() As IEnumerator(Of KeyValuePair(Of String, Object)) Implements IEnumerable(Of KeyValuePair(Of String, Object)).GetEnumerator
Return _dct.GetEnumerator()
End Function
這是因為即使兩個方法實現了不同的接口,也不能使用兩個具有相同名稱的方法。
以下代碼可用於實現IDictionary接口
Imports System.Collections.Generic
Public Class DataDictionary
Implements IDictionary(Of String, Object)
Private _ce As CalcEngine.CalcEngine
Private _dct As Dictionary(Of String, Object)
Public Sub New(ByVal ce As CalcEngine.CalcEngine)
_ce = ce
_dct = New Dictionary(Of String, Object)()
End Sub
'---------------------------------------------------------------
#Region "IDictionary<string,object> Members"
Public Sub Add(ByVal key As String, ByVal value As Object) Implements Collections.Generic.IDictionary(Of String, Object).Add
_dct.Add(key, value)
End Sub
Public Function ContainsKey(ByVal key As String) As Boolean Implements System.Collections.Generic.IDictionary(Of String, Object).ContainsKey
Return _dct.ContainsKey(key)
End Function
Public ReadOnly Property Keys() As ICollection(Of String) Implements System.Collections.Generic.IDictionary(Of String, Object).Keys
Get
Return _dct.Keys
End Get
End Property
Public Function Remove(ByVal key As String) As Boolean Implements System.Collections.Generic.IDictionary(Of String, Object).Remove
Return _dct.Remove(key)
End Function
Public ReadOnly Property Values() As ICollection(Of Object) Implements System.Collections.Generic.IDictionary(Of String, Object).Values
Get
Return _dct.Values
End Get
End Property
Public Function TryGetValue(ByVal key As String, ByRef value As Object) As Boolean Implements System.Collections.Generic.IDictionary(Of String, Object).TryGetValue
If _dct.TryGetValue(key, value) Then
Dim expr = TryCast(value, String)
If expr IsNot Nothing AndAlso expr.Length > 0 AndAlso expr(0) = "="c Then
value = _ce.Evaluate(expr.Substring(1))
End If
Return True
End If
Return False
End Function
Default Public Property Item(ByVal key As String) As Object Implements System.Collections.Generic.IDictionary(Of String, Object).Item
Get
Dim value As Object
If TryGetValue(key, value) Then
Return value
End If
Throw New Exception("invalid index")
End Get
Set(ByVal value As Object)
_dct(key) = value
End Set
End Property
#End Region
'---------------------------------------------------------------
#Region "ICollection<KeyValuePair<string,object>> Members"
Public Sub Add(ByVal item As KeyValuePair(Of String, Object)) Implements System.Collections.Generic.ICollection(Of KeyValuePair(Of String, Object)).Add
Dim d = TryCast(_dct, ICollection(Of KeyValuePair(Of String, Object)))
d.Add(item)
End Sub
Public Sub Clear() Implements System.Collections.Generic.ICollection(Of KeyValuePair(Of String, Object)).Clear
_dct.Clear()
End Sub
Public Function Contains(ByVal item As KeyValuePair(Of String, Object)) As Boolean Implements System.Collections.Generic.ICollection(Of KeyValuePair(Of String, Object)).Contains
Dim d = TryCast(_dct, ICollection(Of KeyValuePair(Of String, Object)))
Return d.Contains(item)
End Function
Public Sub CopyTo(ByVal array As KeyValuePair(Of String, Object)(), ByVal arrayIndex As Integer) Implements System.Collections.Generic.ICollection(Of KeyValuePair(Of String, Object)).CopyTo
Dim d = TryCast(_dct, ICollection(Of KeyValuePair(Of String, Object)))
d.CopyTo(array, arrayIndex)
End Sub
Public ReadOnly Property Count() As Integer Implements System.Collections.Generic.ICollection(Of KeyValuePair(Of String, Object)).Count
Get
Return _dct.Count
End Get
End Property
Public ReadOnly Property IsReadOnly() As Boolean Implements System.Collections.Generic.ICollection(Of KeyValuePair(Of String, Object)).IsReadOnly
Get
Return False
End Get
End Property
Public Function Remove(ByVal item As KeyValuePair(Of String, Object)) As Boolean Implements System.Collections.Generic.ICollection(Of KeyValuePair(Of String, Object)).Remove
Dim d = TryCast(_dct, ICollection(Of KeyValuePair(Of String, Object)))
Return d.Remove(item)
End Function
#End Region
'---------------------------------------------------------------
#Region "IEnumerable<KeyValuePair<string,object>> Members"
Public Function GetEnumerator2() As IEnumerator(Of KeyValuePair(Of String, Object)) Implements IEnumerable(Of KeyValuePair(Of String, Object)).GetEnumerator
Return TryCast(_dct.GetEnumerator(), IEnumerator(Of KeyValuePair(Of String, Object)))
End Function
#End Region
'---------------------------------------------------------------
#Region "IEnumerable Members"
Private Function GetEnumerator() As System.Collections.IEnumerator Implements System.Collections.IEnumerable.GetEnumerator
Return TryCast(_dct.GetEnumerator(), System.Collections.IEnumerator)
End Function
#End Region
End Class
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.