C# 4.0과 선택적 매개 변수와 오버로드의 조합이 모호성에 대한 경고를 제공합니까?
-
06-07-2019 - |
문제
나는 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