Выражение является значением и, следовательно, не может быть целью назначения - PullRequest
2 голосов
/ 25 марта 2009

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

У меня есть структура, определенная так:

public struct PaymentDetail
{
    public Decimal Amount{get;set;}
    public string CheckNumber{get;set;}
    public PaymentType PaymentType{get;set;}
}

У меня есть класс, который содержит эту информацию

public class Transaction
{
    public PaymentDetail Payment{get;}
}

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

public class ViewModel
{
    public Decimal Amount
    {
        get{return _Transaction.PaymentDetail.Amount;}
        set
        {
             //This is the offending line of code
             _Transaction.PaymentDetail.Amount = value;
             RaisePropertyChanged("Amount");
        }
    }
}

Что странно, я могу сделать эту работу, если я изменю свойство Payment на открытое поле, например:

public class Transaction
{
    public PaymentDetail Payment;
}

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

Ответы [ 2 ]

6 голосов
/ 25 марта 2009

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

Дело в том; когда вы вызываете свойство (например, Payment), вы получаете копию значения (в локальной области стека). Для класса это копия ссылки (без проблем). Для структуры это копия самой структуры. Любые изменения этого значения будут отклонены, поэтому компилятор остановил вас от потери данных.

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

Сделать PaymentDetail классом; это правильное решение здесь ...

В .NET структуры не являются «объектами без поведения» - они являются «типами значений». Такие вещи, как «пара валюта / значение», «временной диапазон» и т. Д. Могут создавать допустимые структуры, но не PaymentDetail.

0 голосов
/ 25 марта 2009

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

Добавление сеттера должно исправить проблему.

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

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