없습니다 - c# 참조 리턴




반환 값 오류를 수정할 수 없습니다. C# (4)

자동 구현 속성을 사용하고 있습니다. 다음과 같은 문제를 해결하는 가장 빠른 방법은 내 자체 변수를 선언하는 것입니다.

public Point Origin { get; set; }

Origin.X = 10; // fails with CS1612

오류 메시지 : 변수가 아니기 때문에 'expression'의 반환 값을 수정할 수 없습니다.

중간 표현식의 결과 인 값 유형을 수정하려고했습니다. 값이 지속되지 않으므로 값은 변경되지 않습니다.

이 오류를 해결하려면 표현식의 결과를 중간 값에 저장하거나 중간 표현식에 대한 참조 유형을 사용하십시오.


문제는 스택에있는 값을 가리키며 값이 다시 orignal 속성으로 다시 적용되지 않으므로 C #에서는 값 유형에 대한 참조를 반환 할 수 없습니다. 나는 당신이 Origin 속성을 제거함으로써 이것을 해결할 수 있다고 생각하며 대신 공개 된 파일을 사용합니다. 그렇습니다. 좋은 해결책이 아니라는 것을 압니다. 다른 해결책은 Point를 사용하지 않고 대신 자신의 Point 유형을 객체로 생성하는 것입니다.


여기서 catch는 개체 자체를 할당하는 대신 문에서 개체의 하위 값을 할당하려고한다는 것입니다. 이 경우 전체 Point 객체를 할당해야합니다. 속성 유형은 Point입니다.

Point newOrigin = new Point(10, 10);
Origin = newOrigin;

희망을 거기서 만든 희망


지금까지 오류의 원인을 이미 알고 있습니다. 속성 (이 경우 X )을 가져 오는 오버로드가있는 생성자가없는 경우 객체 이니셜 라이저 (장면 뒤에서 모든 마법을 수행함)를 사용할 수 있습니다. 구조체를 변경할 필요가 없지만 추가 정보를 제공 할 필요는 없습니다 .

struct Point
{
    public int X { get; set; }
    public int Y { get; set; }
}

class MyClass
{
    public Point Origin { get; set; }
}

MyClass c = new MyClass();
c.Origin.X = 23; //fails.

//but you could do:
c.Origin = new Point { X = 23, Y = c.Origin.Y }; //though you are invoking default constructor

//instead of
c.Origin = new Point(23, c.Origin.Y); //in case there is no constructor like this.

이것은 장면 뒤에 있기 때문에 가능합니다.

Point tmp = new Point();
tmp.X = 23;
tmp.Y = Origin.Y;
c.Origin = tmp;

이것은 매우 이상한 일처럼 보입니다 . 전혀 권장되지 않습니다. 대체 방법을 나열하면됩니다. 더 좋은 방법은 struct를 변경 불가능하게 만들고 적절한 생성자를 제공하는 것입니다.


백업 변수를 사용하면 도움이되지 않습니다. Point 유형은 값 유형입니다.

Origin 속성에 전체 Point 값을 지정해야합니다.

Origin = new Point(10, Origin.Y);

문제는 Origin 속성에 액세스 할 때 get 이 반환하는 내용은 Origin 속성 자동 생성 필드에서 Point 구조체의 복사본입니다. 따라서이 사본을 X 필드로 수정해도 기본 필드에는 영향을 미치지 않습니다. 컴파일러는이를 감지하고이 작업이 완전히 쓸모 없으므로 오류를 발생시킵니다.

자신의 백업 변수를 사용하더라도 get 은 다음과 같습니다.

get { return myOrigin; }

당신은 여전히 ​​Point 구조체의 복사본을 리턴 할 것이고 당신은 같은 에러를 보게 될 것입니다.

흠 ... 당신의 질문을 좀 더주의 깊게 읽었을 때 실제로 수업 내에서 직접 변수를 수정하는 것이 좋습니다.

myOrigin.X = 10;

예, 당신이 필요로하는 것이 었습니다.





immutability