Ошибка: “Не может изменить возвращаемое значение” c#

Я использую автореализованные свойства. Я предполагаю, что самый быстрый способ зафиксировать следующее состоит в том, чтобы объявить мою собственную переменную поддержки?

public Point Origin { get; set; }

Origin.X = 10; // fails with CS1612

Сообщение об ошибке: не Может изменить возвращаемое значение 'выражения', потому что это не переменная

Попытка была предпринята для изменения типа значения, который был результатом промежуточного выражения. Поскольку значение не сохраняется, значение будет неизменно.

Для разрешения этой ошибки сохраните результат выражения в промежуточном значении или используйте ссылочный тип для промежуточного выражения.

135
задан DaveInCaz 6 September 2019 в 18:22
поделиться

5 ответов

Это потому, что Точка является типом значения ( struct ).

Из-за этого при доступе к Origin , вы обращаетесь к копии значения, хранящегося в классе, а не к самому значению, как для ссылочного типа ( class ), поэтому, если вы установите X на нем, то вы устанавливаете свойство на копии, а затем отбрасываете его, оставляя исходное значение без изменений. Вероятно, это не то, что вы намеревались сделать, поэтому компилятор предупреждает вас об этом.

Если вы хотите изменить только значение X , вам нужно сделать что-то вроде этого:

Origin = new Point(10, Origin.Y);
176
ответ дан 23 November 2019 в 23:48
поделиться

Просто удалите свойство, "установлены" следующим образом, и затем все работает как всегда.

В случае типов примитивов instread используют получение; набор;...

using Microsoft.Xna.Framework;
using System;

namespace DL
{
    [Serializable()]
    public class CameraProperty
    {
        #region [READONLY PROPERTIES]
        public static readonly string CameraPropertyVersion = "v1.00";
        #endregion [READONLY PROPERTIES]


        /// <summary>
        /// CONSTRUCTOR
        /// </summary>
        public CameraProperty() {
            // INIT
            Scrolling               = 0f;
            CameraPos               = new Vector2(0f, 0f);
        }
        #region [PROPERTIES]   

        /// <summary>
        /// Scrolling
        /// </summary>
        public float Scrolling { get; set; }

        /// <summary>
        /// Position of the camera
        /// </summary>
        public Vector2 CameraPos;
        // instead of: public Vector2 CameraPos { get; set; }

        #endregion [PROPERTIES]

    }
}      
0
ответ дан 23 November 2019 в 23:48
поделиться

Проблема в том, что вы указываете значение, находящееся в стеке, и значение не будет возвращено обратно в свойство orignal, поэтому C # не позволяет вы должны вернуть ссылку на тип значения. Я думаю, вы можете решить эту проблему, удалив свойство Origin и вместо этого используя публичное поле, да, я знаю, что это не очень хорошее решение. Другое решение - не использовать Point, а вместо этого создать собственный тип Point как объект.

0
ответ дан 23 November 2019 в 23:48
поделиться

Использование резервной переменной не поможет. Тип Point - это тип значения.

Вам необходимо присвоить все значение Point свойству Origin: -

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

Проблема в том, что при доступе к свойству Origin то, что возвращается get - это копия структуры Point в автоматически созданном поле свойств Origin. Следовательно, ваша модификация поля X этой копии не повлияет на базовое поле. Компилятор обнаруживает это и выдает ошибку, поскольку эта операция совершенно бесполезна.

Даже если бы вы использовали свою собственную поддерживающую переменную, ваше get будет выглядеть так: -

get { return myOrigin; }

Вы все равно вернете копию структуры Point, и вы получите ту же ошибку.

Хм ...

8
ответ дан 23 November 2019 в 23:48
поделиться

Я полагаю, что загвоздка здесь в том, что вы пытаетесь назначить вспомогательные значения объекта в операторе, а не назначать сам объект. В этом случае вам нужно назначить объект Point целиком, поскольку тип свойства - Point.

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

Надеюсь, я понял это

0
ответ дан 23 November 2019 в 23:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: