UFO ET IT

언어 사양에 설명 된대로 C # 유형 추론을 이해하는 데 문제가 있습니다.

ufoet 2020. 11. 28. 13:18
반응형

언어 사양에 설명 된대로 C # 유형 추론을 이해하는 데 문제가 있습니다.


C # 언어 사양 섹션 §7.5.2에서 타입 추론을 설명합니다. 내가 이해하지 못하는 세부 사항이 있습니다. 다음 경우를 고려하십시오.

// declaration
void Method<T>(T obj, Func<string, T> func);

// call
Method("obj", s => (object) s);

Microsoft 및 Mono C # 컴파일러 모두 T=를 올바르게 추론 object하지만 사양의 알고리즘에 대한 이해는 T=를 생성 string하고 실패합니다. 내가 이해하는 방법은 다음과 같습니다.

첫 번째 단계

  • Ei가 익명 함수 인 경우 Ei에서 Ti로 명시적인 매개 변수 유형 유추 (§7.5.2.7)가 수행됩니다.

    ⇒ 람다 표현식에는 명시적인 매개 변수 유형이 없기 때문에 효과가 없습니다. 권리?

  • 그렇지 않고 Ei가 U 유형이고 xi가 값 매개 변수이면 U에서 Ti로 하한 추론 이 수행됩니다.

    ⇒ 첫 번째 매개 변수는 정적 유형 string이므로 string에 대한 하한값 이 추가 됩니다 T.

두 번째 단계

  • Xj (§7.5.2.5) 에 의존 하지 않는 모든 고정되지 않은 유형 변수 Xi 는 고정되어 있습니다 (§7.5.2.10).

    T고정되지 않음; T아무것도 의존하지 않습니다 ... 그러니 T고쳐야 하지요?

§7.5.2.11 고정

  • 후보 유형 Uj 세트는 Xi에 대한 경계 세트의 모든 유형 세트로 시작합니다.

    ⇒ { string(하한)}

  • 그런 다음 Xi에 대한 각 경계를 차례로 조사합니다. [...] Xi의 각 하한 U에 대해 U에서 암시 적 변환이없는 모든 유형 Uj가 후보 집합에서 제거됩니다. [...]

    ⇒ 후보 세트에서 아무것도 제거하지 않습니까?

  • 나머지 후보 유형 Uj 중에 다른 모든 후보 유형에 대한 암시 적 변환이있는 고유 한 유형 V가있는 경우 Xi는 V로 고정됩니다.

    ⇒ 후보 유형이 하나뿐이므로 모호한 사실이므로 Xi는 string. 권리?


그래서 내가 어디로 잘못 가고 있습니까?


업데이트 : 오늘 아침 버스에 대한 나의 초기 조사는 불완전하고 잘못되었습니다. 첫 번째 단계 사양의 텍스트가 정확합니다. 구현이 정확합니다.

두 번째 단계에서 이벤트 순서가 잘못되었다는 점에서 사양이 잘못되었습니다. 비 종속 매개 변수를 수정 하기 전에 출력 유형 추론을 수행하도록 지정해야합니다 .

이건 복잡해. 나는 내가 기억할 수있는 것보다 더 많이 스펙의이 섹션을 재 작성했다.

이전에이 문제를 본 적이 있으며 잘못된 용어 "유형 변수"가 모든 곳에서 "유형 매개 변수"로 대체되도록 수정 한 것을 분명히 기억합니다. (유형 매개 변수는 내용이 다를 수있는 저장 위치가 아니므로 변수라고 부르는 것은 이치에 맞지 않습니다.) 동시에 순서가 잘못되었다고 생각합니다. 아마 우연히 웹에서 이전 버전의 사양을 발송했을 것입니다. 많은 사과드립니다.

Mads와 협력하여 구현과 일치하도록 사양을 업데이트 할 것입니다. 두 번째 단계의 올바른 표현은 다음과 같아야한다고 생각합니다.

  • 고정되지 않은 유형 매개 변수가 없으면 유형 추론이 성공합니다.
  • 그렇지 않으면, Ti 유형을 갖는 Ei의 출력 유형이 적어도 하나의 고정되지 않은 유형 매개 변수 Xj를 포함하고 Ti 유형을 갖는 Ei의 입력 유형이 고정되지 않은 유형 매개 변수를 포함하지 않도록 대응하는 매개 변수 유형 Ti를 갖는 하나 이상의 인수 Ei가있는 경우 Xj이면 이러한 모든 Ei에서 Ti까지 출력 유형 추론이 수행됩니다.

이전 단계에서 실제로 추론을 수행했는지 여부에 관계없이 이제 다음과 같이 하나 이상의 유형 매개 변수를 수정해야합니다.

  • Xi가 고정되지 않은 유형 매개 변수 Xi가 하나 이상 존재하고 Xi에 비어 있지 않은 경계 세트가 있고 Xi가 Xj에 의존하지 않는 경우 이러한 각 Xi가 고정됩니다. 수정 작업이 실패하면 유형 추론이 실패합니다.
  • 그렇지 않으면 Xi가 고정되지 않은 하나 이상의 유형 매개 변수 Xi가 있고 Xi에 비어 있지 않은 경계 집합이 있고 Xi에 종속되는 하나 이상의 유형 매개 변수 Xj가 있으면 이러한 각 Xi가 고정됩니다. 수정 작업이 실패하면 유형 추론이 실패합니다.
  • 그렇지 않으면 진행할 수 없으며 고정되지 않은 매개 변수가 있습니다. 유형 추론이 실패합니다.

유형 추론이 실패하거나 성공하지 않으면 두 번째 단계가 반복됩니다.

여기서 아이디어는 알고리즘이 무한 루프에 들어 가지 않도록 보장하는 것입니다. 두 번째 단계가 반복 될 때마다 성공, 실패 또는 진행됩니다. 유형을 수정할 유형 매개 변수보다 더 많이 반복 할 수 없습니다.

관심을 가져 주셔서 감사합니다.

참고 URL : https://stackoverflow.com/questions/3697252/problem-understanding-c-sharp-type-inference-as-technology-in-the-language-specif

반응형