2011-08-19 1 views
1

오류 : 선택적 매개 변수에 의해서만 다르기 때문에 서로 오버로드 할 수 없습니다.왜 부적절한 과부하입니까?

하나의 메소드에는 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 

답변

4

선택적 매개 변수는 컴파일러가 사용해야하는 기능을 혼란스럽게합니다.

또한 컴파일러는 두 번째 슬롯의 문자열이기 때문에 두 함수간에 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

아. 내가 참조. 고맙습니다. – dotnetN00b

0

, 당신은 3 개 개의 매개 변수를 전달할 때이 기능을 사용 :

이 뭔가를 고려하는 것이 좋습니다? 선택적 매개 변수를 사용하는 첫 번째 매개 변수 또는 필수 매개 변수와 선택 항목의 기본값을 사용하는 두 번째 매개 변수

0

문제는 식별입니다.

하나의 매개 변수가 선택 사항이기 때문에 서명이 다른 두 가지 방법이있는 경우 컴파일러는 매개 변수의 기본값을 사용하여 매개 변수 나 메서드 B없이 메서드 A를 호출 할 것인지 여부를 알 수 없습니다.

메서드 중 하나의 이름을 바꾸거나 선택적 매개 변수가있는 메서드에 'ByValueOrDefault'라는 단어를 추가하거나 옵션이 아닌 것으로 만들어야합니다.