c# - Невозможно изменить ошибку возвращаемого значения c #





variables struct immutability (6)


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

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

public Point Origin { get; set; }

Origin.X = 10; // fails with CS1612

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

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

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




К настоящему времени вы уже знаете, что является источником ошибки. В случае, если конструктор не существует с перегрузкой, чтобы взять ваше свойство (в этом случае 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;

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




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

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

Надеюсь, я имел смысл там




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

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

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

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

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

get { return myOrigin; }

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

Хм ... более внимательно прочитав ваш вопрос, возможно, вы на самом деле хотите изменить переменную поддержки непосредственно из своего класса:

myOrigin.X = 10;

Да, это было бы то, что вам нужно.




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

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

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

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



public enum Suit : int
{
    Spades = 0,
    Hearts = 1,
    Clubs = 2,
    Diamonds = 3
}

Console.WriteLine((int)(Suit)Enum.Parse(typeof(Suit), "Clubs"));

//from int
Console.WriteLine((Suit)1);

//From number you can also
Console.WriteLine((Suit)Enum.ToObject(typeof(Suit), 1));

if (typeof(Suit).IsEnumDefined("Spades"))
{
    var res = (int)(Suit)Enum.Parse(typeof(Suit), "Spades");
    Console.Out.WriteLine("{0}", res);
}






c# variables struct immutability