역사적으로 .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가 계속 중단되도록 구성하는 방법이 있습니까?
답변
이것은 C # 8.0의 새로운 기능으로, 로컬 함수 및 람다 매개 변수는 외부 이름을 숨길 수 있습니다.
답변
내 생각에 select 함수는 호스트 메서드 본문에 연결되어 있지 않기 때문에 정적으로 컴파일되고 있습니다. 단지 문제의 항목을 인쇄하고 반환합니다. 이것은 메소드에 대한 액세스가 필요하지 않으므로 최적화 이유로 메소드 본문 밖으로 이동하여 글로벌 범위 내에서 자체적으로 배치 할 수 있습니다.
이 경우 해당 테스트 변수는 자체 변수이며 위의 테스트 변수에 연결되지 않습니다.
이를 방지하기 위해 오류가 발생했을 때 vs를 알 수 없으므로 변수 이름을 수동으로 변경하면됩니다.