이없는 동안 당신이 컴파일러 오류왜 증가하는 사업자 심판
에게 발행하는
ref
매개 변수로 속성을 통과하려고하면이public class Foo { public int Bar { get; set; } = 42; }
같은 클래스가 말 CS0206 속성 또는 인덱서가 외곽 또는 참조로 전달되지 않을 수 있습니다.
이것은 prac 위 예제의 속성은 get_Bar()
및 set_Bar()
메서드로 컴파일됩니다. 그러나 속성에서 증분 연산자를 사용하면
var foo = new Foo();
foo.Bar++;
과 같이 작동합니다.
이var foo = new Foo();
int tmp = foo.get_Bar();
tmp++;
foo.set_Bar(tmp);
그래서 이론적으로 컴파일러 같은 ref
에 대한 비슷한 일을 할 수있는 :이를 위해, 컴파일러는이 의사 코드 같은 것을 생산하기 위해 필요한 기술적 인 이유가
var foo = new Foo();
int tmp = foo.get_Bar();
DoSomething(ref tmp);
foo.set_Bar(tmp);
을 왜 컴파일러가하지 않거나 C# 팀의 설계 결정 이었습니까?
. 그것은 친숙한 *이 될 수있는 언어의 일종이며, C#은 * 순수한 *을 의미했습니다. 순도가 잠재적으로 값 비쌀 수있는 설정 호출을 숨기거나 잘못된 위치에서 예외를 생성하거나 컴파일하기가 어려우며 컴파일 오류가 발생하거나 앨리어싱 문제가 발생할 수있는 상황에서는 순도가 그다지 좋지 않습니다. 그러나 ++ 연산자는 매우 순수하지 않고 여러 가지 규칙을 적용합니다. 예를 들어, 캐스트없이 * byte *를 증가시킬 수 있습니다. 그들은 실용적으로하기로 결정했습니다. 선택. –
가능한 복제본 : http://stackoverflow.com/questions/1402803/passing-properties-by-reference-in-c-sharp – Abion47
@HansPassant 답변에 사용자의 의견을 자세히 설명 할 수 있다면 받아 들일 것입니다. –