C# 4.0과 선택적 매개 변수와 오버로드의 조합이 모호성에 대한 경고를 제공합니까?

StackOverflow https://stackoverflow.com/questions/1211203

문제

나는 C# 4.0의 섹션이 포함 된 Jon Skeet의 초기 액세스 버전을 읽기 시작했고, 한 가지가 저를 강타했습니다. 불행히도 나는 Visual Studio 2010을 사용할 수 없으므로 대신 여기서 물어보고 누군가가 답을 알고 있는지 확인했다고 생각했습니다.

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

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 매개 변수가있는 것을 호출합니까?

도움이 되었습니까?

해결책

경고없이 컴파일되며 첫 번째 오버로드를 선택합니다.

선택 사항 및 명명 된 매개 변수의 도입으로 C#의 과부하 분해능 메커니즘이 실제로 복잡해졌습니다. 그러나이 특정한 경우에는 의미가 있습니다. 평소와 같이 컴파일러는 인수와 일치하는 가장 구체적인 오버로드를 선택합니다.

이 특정 사례는 C# 1.0과 크게 다르다고 생각하지 않습니다.

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

이는 동일하게 작동합니다 (오버로드 해상도 측면에서).

후속 답변 : 나는 그렇게 생각하지 않습니다. 메소드 호출에서 기본 인수를 수동으로 지정해야합니다. 그러나 if x 또는 y 매개 변수는 다음과 같은 이름이 다릅니다.

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

두 번째 과부하를 선택할 수 있습니다.

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

다른 팁

이것은 장의 "과부하 해상도"섹션으로 다루어집니다.

컴파일러에 선택할 수있는 두 가지 옵션이있는 경우, 업플을 선호하는 옵션 매개 변수를 사용하지 않아도되는 오버로드를 사용하지만 엄격한 이진 선택입니다. Unsupplied 옵션 매개 변수 하나가있는 과부하 중 하나와 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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top