메서드 그룹 자연 형식 개선
메모
이 문서는 기능 사양입니다. 사양은 기능의 디자인 문서 역할을 합니다. 여기에는 기능 디자인 및 개발 중에 필요한 정보와 함께 제안된 사양 변경 내용이 포함됩니다. 이러한 문서는 제안된 사양 변경이 완료되고 현재 ECMA 사양에 통합될 때까지 게시됩니다.
기능 사양과 완료된 구현 간에 약간의 불일치가 있을 수 있습니다. 이러한 관련 차이는 언어 디자인 모임(LDM) 노트에 기록됩니다.
사양문서에서 기능 스펙릿을 C# 언어 표준으로 채택하는 프로세스에 대해 자세히 알아볼 수 있습니다.
챔피언 이슈: https://github.com/dotnet/csharplang/issues/7429
요약
이 제안은 다음과 같은 몇 가지 방법으로 메서드 그룹의 자연 형식에 대한 결정을 구체화합니다.
- 후보 메서드를 범위별로 고려하되, 먼저 인스턴스 메서드를, 그리고 확장 메서드의 각 후속 범위를 순차적으로 고려합니다.
- 성공할 가능성이 없는 후보를 정리하므로 고유한 서명을 결정하는 데 방해가 되지 않습니다.
- 형식 인수가 제공되지 않는 경우 제네릭 인스턴스 메서드 정리(
var x = M;
) - 확장 기능을 축소할 수 있는지와 제약 조건에 따라 제네릭 확장 메서드를 정리합니다.
- 형식 인수가 제공되지 않는 경우 제네릭 인스턴스 메서드 정리(
메서드 그룹 내추럴 형식의 컨텍스트
C# 10에서 메서드 그룹은 약한 자연 형식을 얻었습니다.
해당 형식은 메서드 그룹이 대상 형식이 아닌 경우에만 작동한다는 측면에서 "약한 형식"입니다(즉, System.Action a = MethodGroup;
역할을 하지 않음).
이 약한 자연 형식은 var x = MethodGroup;
같은 시나리오를 허용합니다.
메서드 그룹의 모든 후보 메서드에 공통 서명이 있는 경우 메서드 그룹에는 자연 형식이 있습니다. (메서드 그룹에 확장 메서드가 포함될 수 있는 경우 후보는 포함하는 형식 및 모든 확장 메서드 범위를 포함합니다.)
실제로 이는 다음을 의미합니다.
- 모든 후보 메서드 집합을 생성합니다.
- 관련 형식의 메서드는 정적이며 수신기가 형식이거나 비정적이고 수신기가 값인 경우 집합에 있습니다.
- 축소할 수 있는 확장 메서드(모든 범위에서)가 집합에 있습니다.
- 모든 후보 서명이 일치하지 않으면 메서드 그룹에 자연 형식이 없습니다.
- 결과 서명의 결과값이 제공된 형식 인수의 수와 일치하지 않는 경우 메서드 그룹에는 자연 형식이 없습니다.
- 그렇지 않으면 결과 서명이 자연 형식으로 사용됩니다.
제안
각 범위별로 접근하여 가능한 한 빨리 성공할 수 없다는 것을 알고 있는 후보를 제거하는 원칙입니다(오버로드 해소에 사용되는 것과 동일한 원칙).
- 각 범위에 대해 모든 후보 메서드 집합을 생성합니다.
- 초기 범위의 경우 제공된 형식 인수와 일치하는 특성이 있는 관련 형식의 메서드 및 제공된 형식 인수와 충족되는 제약 조건이 정적이며 수신기가 형식인 경우 또는 비정적이고 수신기가 값인 경우 집합에 있습니다.
- 후속의 각 범위에 대해 제공된 타입 인수를 사용하여 대체할 수 있으며, 수신기의 값을 활용하여 제약 조건을 충족하는 확장 메서드는 해당 집합에 포함됩니다.
- 지정된 범위에 후보가 없는 경우 다음 범위로 진행합니다.
- 모든 후보 서명이 일치하지 않으면 메서드 그룹에 자연 형식이 없습니다.
- 그렇지 않으면 결과 서명이 자연 형식으로 사용됩니다.
- 범위가 소진된 경우 메서드 그룹에 자연 형식이 없습니다.
범위별 제안과 관련이 있습니다. https://github.com/dotnet/csharplang/issues/7364 제네릭 확장 메서드를 더 잘 처리하기 위한 제안과 관련이 있습니다. https://github.com/dotnet/roslyn/issues/69222
C# feature specifications