이것은 버그입니까?
예.
축하합니다. 과부하 해결에서 버그를 발견했습니다. 버그는 C # 4 및 5에서 재현됩니다. 의미 분석기의 "Roslyn"버전에서는 재현되지 않습니다. C # 5 테스트 팀에 알 렸으며 최종 릴리스 전에이 문제를 조사하고 해결할 수 있기를 바랍니다. (항상 그렇듯이 약속은 없습니다.)
올바른 분석이 이어집니다. 후보자는 다음과 같습니다.
0: C(params string[]) in its normal form
1: C(params string[]) in its expanded form
2: C<string>(string)
3: C(string, object)
후보 0은로 string
변환 할 수 없기 때문에 분명히 적용 할 수 없습니다 string[]
. 3 개 남았습니다.
세 가지 중 고유 한 최선의 방법을 결정해야합니다. 나머지 세 후보를 쌍으로 비교하여이를 수행합니다. 그러한 세 쌍이 있습니다. 생략 된 선택적 매개 변수를 제거 하면 모두 동일한 매개 변수 목록을 가지므로 사양의 섹션 7.5.3.2에 설명 된 고급 타이 브레이킹 라운드로 이동해야합니다.
어느 쪽이 더 낫습니까, 1 또는 2? 관련 순위 결정자는 제네릭 메서드가 항상 비 제네릭 메서드보다 나쁘다는 것입니다. 2는 1보다 나쁩니다. 따라서 2는 승자가 될 수 없습니다.
1 또는 3 중 어느 것이 더 낫습니까? 관련 순위 결정자는 다음과 같습니다. 확장 된 형태로만 적용 할 수있는 방법은 항상 일반 형태로 적용 할 수있는 방법보다 나쁩니다. 따라서 1은 3보다 나쁩니다. 따라서 1이 승자가 될 수 없습니다.
2 개 또는 3 개 중 어느 것이 더 낫습니까? 관련 순위 결정자는 제네릭 메서드가 항상 비 제네릭 메서드보다 나쁘다는 것입니다. 2는 3보다 나쁩니다. 따라서 2는 승자가 될 수 없습니다.
여러 적용 가능한 후보자 세트에서 선택 되려면 후보자는 (1) 무패, (2) 적어도 한 명의 다른 후보를 이기고, (3) 처음 두 가지 속성을 가진 고유 한 후보 여야합니다. 후보 3은 다른 후보에 의해 구타를 당하지 않고 적어도 한 명의 다른 후보를 이깁니다. 이 속성을 가진 유일한 후보입니다. 따라서 후보 3은 고유 한 최상의 후보 입니다. 이길 것입니다.
C # 4 컴파일러가 잘못된 오류 메시지를 표시 할뿐만 아니라 기괴한 오류 메시지를보고하고 있음을 올바르게 알 수 있습니다. 컴파일러가 과부하 해결 분석을 잘못 받고 있다는 것은 조금 놀랍습니다. 오류 메시지가 잘못 표시되는 것은 전혀 놀라운 일이 아닙니다. "모호한 방법"오류 휴리스틱은 기본적으로 최상의 방법을 결정할 수없는 경우 후보 집합에서 두 가지 방법을 선택합니다. "실제"모호함을 찾는 데는 그다지 좋지 않습니다.
그 이유를 합리적으로 물을 수 있습니다. 찾기가 매우 까다 롭습니다 둘 은 "betterness"관계이기 때문에 "unambigously 모호한"있는 방법을 자동사 . 후보 1이 2보다 낫고, 2가 3보다 낫고, 3이 1보다 낫다는 상황을 생각 해낼 수 있습니다. 그런 상황에서 우리는 그들 중 두 개를 "모호한 것"으로 선택하는 것보다 더 잘할 수 없습니다.
Roslyn에 대한이 휴리스틱을 개선하고 싶지만 우선 순위가 낮습니다.
(독자에게 연습하십시오. "선형 시간 알고리즘을 개발하여 더 나은 관계가 전 이적이지 않은 n 개의 요소 집합에서 고유 한 최상의 멤버를 식별하십시오"는이 팀을 위해 인터뷰 한 날 제가받은 질문 중 하나였습니다. 매우 어려운 알고리즘입니다. 한번 시도해보세요.)
C #에 선택적 인수를 추가하는 것을 너무 오랫동안 밀어 붙인 이유 중 하나는 과부하 해결 알고리즘에 도입되는 복잡한 모호한 상황의 수가 많기 때문입니다. 분명히 우리는 그것을 제대로 이해하지 못했습니다.
연결 문제를 입력하여 추적하고 싶다면 부담없이 사용하십시오. 우리의 관심을 끌고 싶다면 완료 한 것으로 간주하십시오. 내년에 테스트를 진행하겠습니다.
관심을 가져 주셔서 감사합니다. 오류에 대해 사과드립니다.
'Overloaded.ComplexOverloadResolution(string)'
언급 한다고 생각하지 않는다<string>(string)
.(string, object)
제공된 개체가없는 메서드를 참조한다고 생각합니다 .