다음을 통해 공유


메서드 그룹 자연 형식 개선

메모

이 문서는 기능 사양입니다. 사양은 기능의 디자인 문서 역할을 합니다. 여기에는 기능 디자인 및 개발 중에 필요한 정보와 함께 제안된 사양 변경 내용이 포함됩니다. 이러한 문서는 제안된 사양 변경이 완료되고 현재 ECMA 사양에 통합될 때까지 게시됩니다.

기능 사양과 완료된 구현 간에 약간의 불일치가 있을 수 있습니다. 이러한 관련 차이는 언어 디자인 모임(LDM) 노트에 기록됩니다.

사양문서에서 기능 스펙릿을 C# 언어 표준으로 채택하는 프로세스에 대해 자세히 알아볼 수 있습니다.

챔피언 이슈: https://github.com/dotnet/csharplang/issues/7429

요약

이 제안은 다음과 같은 몇 가지 방법으로 메서드 그룹의 자연 형식에 대한 결정을 구체화합니다.

  1. 후보 메서드를 범위별로 고려하되, 먼저 인스턴스 메서드를, 그리고 확장 메서드의 각 후속 범위를 순차적으로 고려합니다.
  2. 성공할 가능성이 없는 후보를 정리하므로 고유한 서명을 결정하는 데 방해가 되지 않습니다.
    • 형식 인수가 제공되지 않는 경우 제네릭 인스턴스 메서드 정리(var x = M;)
    • 확장 기능을 축소할 수 있는지와 제약 조건에 따라 제네릭 확장 메서드를 정리합니다.

메서드 그룹 내추럴 형식의 컨텍스트

C# 10에서 메서드 그룹은 약한 자연 형식을 얻었습니다.
해당 형식은 메서드 그룹이 대상 형식이 아닌 경우에만 작동한다는 측면에서 "약한 형식"입니다(즉, System.Action a = MethodGroup;역할을 하지 않음).
이 약한 자연 형식은 var x = MethodGroup;같은 시나리오를 허용합니다.

참조: https://github.com/dotnet/csharplang/blob/main/proposals/csharp-10.0/lambda-improvements.md#natural-function-type

메서드 그룹의 모든 후보 메서드에 공통 서명이 있는 경우 메서드 그룹에는 자연 형식이 있습니다. (메서드 그룹에 확장 메서드가 포함될 수 있는 경우 후보는 포함하는 형식 및 모든 확장 메서드 범위를 포함합니다.)

실제로 이는 다음을 의미합니다.

  1. 모든 후보 메서드 집합을 생성합니다.
  • 관련 형식의 메서드는 정적이며 수신기가 형식이거나 비정적이고 수신기가 값인 경우 집합에 있습니다.
  • 축소할 수 있는 확장 메서드(모든 범위에서)가 집합에 있습니다.
  1. 모든 후보 서명이 일치하지 않으면 메서드 그룹에 자연 형식이 없습니다.
  2. 결과 서명의 결과값이 제공된 형식 인수의 수와 일치하지 않는 경우 메서드 그룹에는 자연 형식이 없습니다.
  3. 그렇지 않으면 결과 서명이 자연 형식으로 사용됩니다.

제안

각 범위별로 접근하여 가능한 한 빨리 성공할 수 없다는 것을 알고 있는 후보를 제거하는 원칙입니다(오버로드 해소에 사용되는 것과 동일한 원칙).

  1. 각 범위에 대해 모든 후보 메서드 집합을 생성합니다.
  • 초기 범위의 경우 제공된 형식 인수와 일치하는 특성이 있는 관련 형식의 메서드 및 제공된 형식 인수와 충족되는 제약 조건이 정적이며 수신기가 형식인 경우 또는 비정적이고 수신기가 값인 경우 집합에 있습니다.
  • 후속의 각 범위에 대해 제공된 타입 인수를 사용하여 대체할 수 있으며, 수신기의 값을 활용하여 제약 조건을 충족하는 확장 메서드는 해당 집합에 포함됩니다.
  1. 지정된 범위에 후보가 없는 경우 다음 범위로 진행합니다.
  2. 모든 후보 서명이 일치하지 않으면 메서드 그룹에 자연 형식이 없습니다.
  3. 그렇지 않으면 결과 서명이 자연 형식으로 사용됩니다.
  4. 범위가 소진된 경우 메서드 그룹에 자연 형식이 없습니다.

범위별 제안과 관련이 있습니다. https://github.com/dotnet/csharplang/issues/7364 제네릭 확장 메서드를 더 잘 처리하기 위한 제안과 관련이 있습니다. https://github.com/dotnet/roslyn/issues/69222