【问题标题】:Why is this an improper overload?为什么这是不适当的过载?
【发布时间】:2011-08-19 16:09:25
【问题描述】:

错误:不能相互重载,因为它们仅在可选参数上有所不同。

一种方法有 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

【问题讨论】:

    标签: .net vb.net asp.net-3.5 overloading


    【解决方案1】:

    可选参数混淆了编译器应该使用哪个函数。

    另外,编译器无法区分这两个函数的 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
    

    【讨论】:

      【解决方案2】:

      问题在于识别;

      如果您有两个方法,仅在签名上有所不同,因为一个参数是可选的,那么编译器无法知道您是打算在没有参数的情况下调用方法 A,还是使用参数的默认值调用方法 B。

      您要么需要重命名其中一个方法,要么使用可选参数在方法中添加“ByValueOrDefault”字样,或者使其成为非可选参数。

      【讨论】:

        【解决方案3】:

        由于你的可选参数,当你传递3个参数时它会使用哪个函数?第一个使用可选参数还是第二个不考虑它,只使用必需的参数和可选参数的默认值?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-07-23
          • 1970-01-01
          • 2019-10-04
          • 1970-01-01
          • 1970-01-01
          • 2019-09-13
          • 2020-09-07
          相关资源
          最近更新 更多