variables - 반환 값 오류를 수정할 수 없습니다.C#




struct immutability (5)

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

public Point Origin { get; set; }

Origin.X = 10; // fails with CS1612

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

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

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


Answers

여기서 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;

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


이것은 Point 가 값 유형 ( struct )이기 때문입니다.

이 때문에 Origin 속성에 액세스 할 때 참조 유형 ( class )과 마찬가지로 값 자체가 아닌 클래스가 보유한 값의 복사본 에 액세스하므로 X 속성을 설정하면 복사본의 속성을 설정 한 다음 삭제하고 원래 값을 변경하지 않습니다. 이것은 아마 당신이 의도 한 것이 아니기 때문에 컴파일러가 경고를하는 것입니다.

X 값만 변경하려면 다음과 같이해야합니다.

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

또는 one-liner 대신 확장 메서드를 사용하십시오.

public static T ToEnum<T>(this string enumString)
{
    return (T) Enum.Parse(typeof (T), enumString);
}

용법:

Color colorEnum = "Red".ToEnum<Color>();

또는

string color = "Red";
var colorEnum = color.ToEnum<Color>();




c# variables struct immutability