깊은 통찰력에 감사드립니다.
최선을 다하겠습니다.
다른 답변에서 언급했듯이 컴파일러에서 표현식 이 명령문 으로 사용되고 있음을 감지하고 있습니다. 많은 언어 (C, JavaScript 등)에서 표현식을 명령문으로 사용하는 것은 합법적입니다. 2 + 2;
효력이없는 진술 임에도 불구하고 이러한 언어에서는 합법적입니다. 일부 표현식은 해당 값에만 유용하고 일부 표현식은 부작용 (예 : void returning method 호출)에만 유용하며 일부 표현식은 불행히도 두 가지 모두에 유용합니다. (증가처럼)
요점 : 표현만으로 구성되는 진술은 그 표현이 일반적으로 값보다 부작용에 더 유용한 것으로 생각되지 않는 한 거의 확실하게 오류 입니다. C # 디자이너는 일반적으로 부작용으로 간주되는 표현을 허용하고 일반적으로 가치에 유용한 것으로 간주되는 표현은 허용하지 않음으로써 중간 지점을 찾고자했습니다. C # 1.0에서 식별 한 식 집합은 증분, 감소, 메서드 호출, 할당 및 다소 논쟁의 여지가있는 생성자 호출이었습니다.
ASIDE : 일반적으로 대상의 구성은 구성의 부작용이 아닌 생성 된 값에 사용되는 것으로 생각합니다. 내 생각에 허용 new Foo();
은 약간의 오해입니다. 특히, 실제 패턴에서 보안 결함을 일으키는이 패턴을 보았습니다.
catch(FooException ex) { new BarException(ex); }
코드가 복잡하면이 결함을 발견하기가 놀랍게 어려울 수 있습니다.
따라서 컴파일러는 해당 목록에없는 표현식으로 구성된 모든 명령문을 감지합니다. 특히 괄호로 묶인 표현식은 괄호로 묶인 표현식으로 식별됩니다. "문 표현으로 허용됨"목록에 없으므로 허용되지 않습니다.
이 모든 것은 C # 언어의 디자인 원칙을 따르고 있습니다. 당신이 타이핑 (x++);
했다면 당신은 아마 뭔가 잘못했을 것 입니다. 이것은 아마도 오타 M(x++);
일 수도 있습니다. C # 컴파일러 팀 의 태도는 " 이 작업을 수행 할 수있는 방법을 찾아 낼 수 있는가? " 가 아니라는 점을 기억하십시오 . "C # 컴파일러 팀의 태도는" 유연한 코드가 실수 일 가능성이있는 경우 " 개발자에게 알려주십시오. "입니다. C # 개발자는 그런 태도를 좋아합니다.
이제, C # 사양이 실제로 몇 가지 이상한 경우 가 있습니다. 의미 또는 괄호는 허용하지만 C # 컴파일러 어쨌든을 허용하는 명백한 것을 상태. 대부분의 경우 지정된 동작과 허용 된 동작 사이의 사소한 불일치는 완전히 무해하므로 컴파일러 작성자는 이러한 작은 버그를 수정 한 적이 없습니다. 당신은 그에 대해 읽을 수 있습니다 :
수익률 myVar와 수익률 (myVar)간에 차이가 있습니까?