C # 컴파일러가 중첩 범위에서 중복 변수를 허용하는 이유는 무엇입니까?


18

역사적으로 .Net에서 개발 할 때 중첩 된 범위에서 변수 이름을 복제 할 수 없었습니다 . 그러나 최근 Visual Studio 2019를 버전 16.4.2로 업데이트 한 후 변수 이름이 중첩 범위에서 복제 될 수 있음을 알았습니다.

예를 들면 다음과 같습니다.

var test = "hello";
Console.WriteLine(test);
var things = new []{"one", "two", "three"};
things.Select(test => // <- test is duplicated here, normally this breaks compilation
{
    Console.WriteLine(test);
    return test;
}).ToList();

// output:
// hello
// one
// two
// three

https://dotnetfiddle.net/h85BK4

이것이 왜 갑자기 허용됩니까?

후속 질문 : 이것이 새로운 언어 "기능"이라면 변수가 중첩 범위에서 복제 될 때 Visual Studio가 계속 중단되도록 구성하는 방법이 있습니까?


2
중복 변수를 허용한다고 생각하지 않습니다. test데이터 유형이 동일하므로 동일한 변수를 사용합니다 . 예 testint들어 변수를 선언 하십시오 . var test = 12345;컴파일 오류가 발생해야한다고 생각합니다. (나는 그것을 시도하지 않았다)
LP13

1
@ LP13 test제안 된대로 유형을 변경해 도 아무런 효과가 없습니다. 질문에 링크 된 바이올린에서 시도해 볼 수 있습니다.
Amy

1
대상 프레임 워크는 관련이 없습니다. 새로운 동작은 언어 버전 때문입니다. 이 코드는 C # 8에서 컴파일되고 C # 7.3에서 컴파일되지 않습니다 (이하 가정)
Emanuel Vintilă


6
그것에 대한 GitHub 문제 가 있습니다 . 이정표는 16.5로 설정되어 있습니다. @ OrkhanAlikhanov 당신은 그것을 더 빨리 발견했습니다 :)
Pavel Anikhouski

답변:


1

이것은 C # 8.0의 새로운 기능으로, 로컬 함수 및 람다 매개 변수는 외부 이름을 숨길 수 있습니다.


0

내 생각에 select 함수는 호스트 메서드 본문에 연결되어 있지 않기 때문에 정적으로 컴파일되고 있습니다. 단지 문제의 항목을 인쇄하고 반환합니다. 이것은 메소드에 대한 액세스가 필요하지 않으므로 최적화 이유로 메소드 본문 밖으로 이동하여 글로벌 범위 내에서 자체적으로 배치 할 수 있습니다.

이 경우 해당 테스트 변수는 자체 변수이며 위의 테스트 변수에 연결되지 않습니다.

이를 방지하기 위해 오류가 발생했을 때 vs를 알 수 없으므로 변수 이름을 수동으로 변경하면됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.