0

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) )))'. H:\Test\WindowsApplication1\WindowsApplication1\ProbeDataDictionary.vb 4 16 WindowsApplication1

エラー 3 'Public Function GetEnumerator() As System.Collections.Generic.IEnumerator(Of System.Collections.Generic.KeyValuePair(Of String, Object))' および 'Private Function GetEnumerator() As System.Collections.IEnumerator' は、それぞれをオーバーロードできませんother は、戻り値の型のみが異なるためです。H:\Test\WindowsApplication1\WindowsApplication1\ProbeDataDictionary.vb 96 21 WindowsApplication1

前もって感謝します。

4

2 に答える 2

4

GetEnumerator1 つのメソッドのインターフェイス実装宣言がありません。

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

アップデート

OK、あなたの方法は次のようになります:

Public Function GetEnumeratorGeneric() As IEnumerator(Of KeyValuePair(Of String, Object)) Implements IEnumerable(Of KeyValuePair(Of String, Object)).GetEnumerator
    Return _dct.GetEnumerator()
End Function

これは、異なるインターフェイスを実装していても、同じ名前のメソッドを 2 つ持つことはできないためです。

于 2013-10-11T06:07:29.337 に答える
-1

次のコードは、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
于 2013-10-15T06:06:50.993 に答える