2009-07-31 6 views
6

C# 4.0에 관한 섹션이 포함 된 Jon Skeet의 초기 액세스 버전을 읽기 시작했습니다. 불행히도 Visual Studio 2010을 사용할 수 없으므로 대신 여기에서 질문하고 대답을 알고 있는지 확인해 보았습니다.C# 4.0과 선택적 매개 변수와 과부하 조합을 통해 모호성에 대한 경고를 줄 수 있습니까?

다음 코드, 기존 코드의 혼합, 새로운 코드가있는 경우 :

public void SomeMethod(Int32 x, Int32 y) { ... } 

public void SomeMethod(Int32 x, Int32 y, Int32 z = 0) { ... } 

컴파일러가 정의 사이트 또는 가능한 모호함에 대한 호출 사이트 중 하나 불평 할 것이다

를?

예를 들어,이 코드 조각은 실제로 무엇을할까요?

SomeClass sc = new SomeClass(); 
sc.SomeMethod(15, 23); 

컴파일됩니까? 그것은 z 매개 변수없이 하나를 호출 할 것인가, 아니면 z 매개 변수로 호출 할 것인가?

+0

제쳐두고이 특정 문제를 떠나, 비슷한 질문을하거나 전자 메일 ([email protected])을 통해 직접 새로운 챕터에 대한 피드백을 얻게되어 매우 기쁩니다.희망을 새 물건을 즐기십시오 :) –

+0

나는 더 이상의 의견이나 질문을 보내기 전에 내가 다운로드 한 파일을 읽는거야;)하지만 그래, 나는 피드백을 제공 드리겠습니다. 나는 그 파일을 주말에 인터넷없이 집에 가져갈 것이므로 아마 그것에 대해 조사 할 것이다. –

답변

6

경고없이 컴파일되고 첫 번째 과부하를 선택합니다.

선택적 및 명명 된 매개 변수가 도입됨에 따라 C#의 오버로드 해결 메커니즘이 실제로 복잡해졌습니다. 이 특별한 경우에는, 그것은 이해가됩니다. 평소와 같이 컴파일러는 인수와 일치하는 가장 구체적인 오버로드를 선택합니다.

나는이 특정한 경우는 C# 1.0 다른 많이 생각하지 않는다 : (오버로드 확인의 관점에서) 동일하게 작동

public void SomeMethod(Int32 x, Int32 y) { } 
public void SomeMethod(Int32 x, Int32 y, params Int32[] z) { } 

합니다.

위로 대답 : 나는 그렇게 생각하지 않는다. 메서드 호출에서 기본 인수를 수동으로 지정해야합니다. 당신이 두 번째 오버로드를 선택할 수

public void SomeMethod(Int32 x, Int32 y) { } 
public void SomeMethod(Int32 t, Int32 y, Int32 z = 0) { } 

:

obj.SomeMethod(t: 10, y: 20); 
+1

추가 질문 : 'z'매개 변수를 지정하지 않고 두 번째 오버로드를 호출 할 수있는 방법이 있습니까? – Blixt

9

이이 장의 "과부하 해결 방법"절에 덮여 그러나, x 또는 y 매개 변수와 같은 다른 이름을 가지고 있었다.

컴파일러가 선택할 평등 옵션이 2 개있는 경우 컴파일러는 선택할 수있는 옵션 매개 변수를 사용하지 않아도되는 오버로드를 사용하지만 이진 선택은 엄격합니다. 하나의 보완되지 않은 선택적 매개 변수와 2 개의 과부하 중에서 선택해야하는 경우 모호한 상황으로 간주합니다.

당신의 후속 코멘트에 답하기 위해 필자는 옵션 매개 변수를 지정하지 않고 사용할 수있는 과부하를 강요하지 않습니다. 당신은 예를 들어,이 중 하나를 사용할 수 없습니다

// Both invalid 
sc.SomeMethod(15, 23,); 
sc.SomeMethod(15, 23, z:) 

을, 그러나, 당신의 방법은 서로 다른 매개 변수 이름을 사용하는 경우, 다음을 할 수있는 :

public void SomeMethod(Int32 x, Int32 y) { ... } 
public void SomeMethod(Int32 a, Int32 b, Int32 c = 0) { ... } 

sc.SomeMethod(a: 15, b: 23); // Calls second method 
+0

날 악보를 뛰어 넘는 날 맞습니다 :) –