Почему это неправильная перегрузка? - PullRequest
1 голос
/ 19 августа 2011

Ошибка: невозможно перегрузить друг друга, потому что они отличаются только дополнительными параметрами.

Один метод имеет 3 параметра, а другой - 4 параметра. Чего мне не хватает?

Protected Overloads Function updateResxNodes(ByVal keyCtrl As String, ByVal newValue As String, Optional ByVal newComment As String = "") As List(Of ResXDataNode)

    Dim resxNodesList As List(Of ResXDataNode) = getResourceData()
    For i As Integer = 0 To resxNodesList.Count - 1
        If resxNodesList.Item(i).Name = keyCtrl Then
            Dim name As String = resxNodesList.Item(i).Name
            Dim comment As String = resxNodesList.Item(i).Comment
            Dim newResxNode As ResXDataNode = New ResXDataNode(name, newValue)
            newResxNode.Comment = comment

            resxNodesList.RemoveAt(i)
            resxNodesList.Add(newResxNode)
            Exit For
        End If
    Next

    Return resxNodesList
End Function

Protected Overloads Function updateResxNodes(ByVal keyCtrl As String, ByVal newName As String, ByVal newValue As String, Optional ByVal newComment As String = "") As List(Of ResXDataNode)

    Dim resxNodesList As List(Of ResXDataNode) = getResourceData()
    For i As Integer = 0 To resxNodesList.Count - 1
        If resxNodesList.Item(i).Name = keyCtrl Then
            Dim name As String = resxNodesList.Item(i).Name
            Dim comment As String = resxNodesList.Item(i).Comment
            Dim newResxNode As ResXDataNode = New ResXDataNode(name, newValue)
            newResxNode.Comment = comment

            resxNodesList.RemoveAt(i)
            resxNodesList.Add(newResxNode)
            Exit For
        End If
    Next

    Return resxNodesList
End Function

Ответы [ 3 ]

4 голосов
/ 19 августа 2011

Необязательные параметры сбивают с толку компилятор, для какой функции он должен использовать.

Кроме того, компилятор не может различать параметры newValue и newName между двумя функциями, поскольку они являются строками во втором слоте.

Вы не используете newName во второй функции - это там относится?

Возможно, вы захотите рассмотреть что-то вроде этого:

Protected Overloads Function updateResxNodes(ByVal keyCtrl As String, ByVal newValue As String) As List(Of ResXDataNode)
  Return updateResxNodes(keyCtrl, newValue, String.Empty, String.Empty)
End Function

Protected Overloads Function updateResxNodes(ByVal keyCtrl As String, ByVal newValue As String, ByVal newName As String) As List(Of ResXDataNode)
  Return updateResxNodes(keyCtrl, newValue, newName, String.Empty)
End Function

Protected Overloads Function updateResxNodes(ByVal keyCtrl As String, ByVal newValue As String, ByVal newName As String, ByVal newComment As String) As List(Of ResXDataNode)
  Dim resxNodesList As List(Of ResXDataNode) = getResourceData()
  For i As Integer = 0 To resxNodesList.Count - 1
    If resxNodesList.Item(i).Name = keyCtrl Then
      Dim name As String = resxNodesList.Item(i).Name
      Dim comment As String = resxNodesList.Item(i).Comment
      Dim newResxNode As ResXDataNode = New ResXDataNode(name, newValue)
      newResxNode.Comment = comment
      resxNodesList.RemoveAt(i)
      resxNodesList.Add(newResxNode)
      Exit For
    End If
  Next
  Return resxNodesList
End Function
0 голосов
/ 19 августа 2011

Проблема в идентификации;

Если у вас есть два метода, которые отличаются только по сигнатуре, поскольку один параметр является необязательным, то компилятор не может знать, если вы намеревались вызывать метод A без параметра или метода B, используя значение параметра по умолчанию.

Вам необходимо либо переименовать один из методов, возможно, добавить слова «ByValueOrDefault» в метод с необязательным параметром или сделать его необязательным.

0 голосов
/ 19 августа 2011

Из-за ваших необязательных параметров, какую функцию он будет использовать, когда вы передадите 3 параметра?Первый, использующий необязательный параметр, или второй, игнорирующий его, использующий только обязательные параметры и значение по умолчанию дополнительного параметра?

...