C# Доступ к свойству внутри свойства?

#c# #properties

Вопрос:

Я пытаюсь пройти некоторые тесты в упражнении Exercism C# «весовая машина», в котором используются свойства. У меня есть эти свойства:

 using System;
enum Units
{
   Pounds,
   Kilograms
}

class WeighingMachine
{
    private decimal inputWeight;
    public decimal InputWeight
    {
        get { return inputWeight; }
        set { if (value >= 0)
                inputWeight = value;
            else throw new ArgumentOutOfRangeException();
        }
    }

    private decimal displayWeight;
    public decimal DisplayWeight
    {
        get
        { return displayWeight; }
        set
        {
            displayWeight = InputWeight - TareAdjustment;
            if (displayWeight <= 0)
                throw new ArgumentOutOfRangeException();
        }
    }

    private decimal _pounds;
   
    public USWeight USDisplayWeight
    {
        get { return _pounds; }
        set { _pounds = new USWeight(InputWeight).Pounds; }
    }

    public decimal TareAdjustment { private get; set; }

    public int Units
    { get; set; }
}

    struct USWeight
    {
        public USWeight(decimal weightInPounds)
        {
            Pounds = (int)weightInPounds;
            Ounces = (weightInPounds - Pounds)*16;
        }
    
        public int Pounds { get; set; }

        public decimal Ounces { get; set; }
    }

 

Мой камень преткновения-это тесты:

 [Fact]
public void Get_us_display_weight_pounds()
{
    var wm = new WeighingMachine();
    wm.InputWeight = 60m;
    Assert.Equal(132, wm.USDisplayWeight.Pounds);
}
 

Я не могу понять, как тест запрашивает вес wm.usdisplay.Фунтов — как это .Фунты, доступные в конце? это похоже на то, что в свойстве USDisplayWeight задано свойство, но это невозможно, не так ли? Я не могу заставить компилятор перестать жаловаться на .Фунты — я получаю, что «десятичный» не содержит определения для «Фунтов», и не может быть найден доступный метод расширения «Фунты», принимающий первый аргумент типа «десятичный».

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

Комментарии:

1. Взгляните на определение USDisplayWeight . Это в своем роде decimal , нет USWeight . Вот почему вы получаете ошибку. Свойствам не нужны резервные поля; вы можете написать любой код, который захотите. Сделайте USDisplayWeight так, чтобы получатель просто вернул DisplayWeight значение, умноженное на коэффициент пересчета. Аналогично, попросите сеттера обновить вес usdisplay после преобразования. Имея два поля веса, вы рискуете, что что-то будет весить как 10 кг, так и 8 фунтов.

2. Обратите внимание, что ваш DisplayWeight сеттер не использует предоставленное значение — это немного красный флаг. Вам следует подумать о том, чтобы просто поместить логику в сеттер и сделать ее свойством, доступным только для чтения. (То же USDisplayWeight самое .)

3. Спасибо Flydog57, использование USWeight для типа свойства устранило ошибку. @Джон Скит, я не уверен, что понимаю ваш комментарий о весе дисплея. — он устанавливает значение из двух других значений свойств, также я думал, что у меня есть вся логика в сеттере. похоже, он прошел первый тест: ` [Факт] публичный пустой набор весов и весов() { var wm = новая весовая машина(); wm.Входной вес = 60 м; Утверждение. Равно(60 м, вес на входе, точность: 3); } `

4. @RonCitrus: Дело в том, что кто-то может писать wm.DisplayWeight = 15m ; и присваиваемое значение (15) полностью игнорируется. Вам не нужно поле или что — то еще-просто геттер, который вычисляет результат из других свойств: public decimal DisplayWeight => InputWeight - TareAdjustment; .

5. @Джон Скит, конечно. Спасибо