Задать вопрос
@keddad
Ученик

Почему метод ToString не рабоатет?

У меня есть некоторый класс

spoiler
using System;

namespace untc
{
    class Fraction
    {

        private long numerator;
        private ushort denumerator;

        public long Numerator { get => numerator; }
        public ushort Denumerator { get => denumerator; }

        public override string ToString()
        {
            return String.Format("{0}/{1}", this.numerator, this.denumerator);
        }

        private void optimise()
        {
            long n = this.numerator;
            long d = this.denumerator;
            long remainder;
            while (d != 0)
            {
                remainder = n % d;
                n = d;
                d = remainder;
            }

            this.numerator /= n;
            this.denumerator /= (ushort)n;
        }

        public static Fraction operator +(Fraction a, Fraction b)
        {
            return new Fraction(a.Numerator * b.Denumerator + b.Numerator * a.Denumerator, a.Denumerator * b.Denumerator);
        }

        public static Fraction operator -(Fraction a, Fraction b)
        {
            return new Fraction(a.Numerator * b.Denumerator - b.Numerator * a.Denumerator, a.Denumerator * b.Denumerator);
        }

        public static Fraction operator *(Fraction a, Fraction b)
        {
            return new Fraction(a.Numerator * b.Numerator, a.Denumerator * b.Denumerator);
        }

        public static Fraction operator /(Fraction a, Fraction b)
        {
            return new Fraction(a.Numerator * b.Denumerator, a.Denumerator * b.Numerator);
        }

        public static bool operator ==(Fraction a, Fraction b)
        {
            return a.Numerator == b.Numerator && a.Denumerator == b.Denumerator;
        }

        public static bool operator !=(Fraction a, Fraction b)
        {
            return a.Numerator != b.Numerator || a.Denumerator != b.Denumerator;
        }

        public Fraction(long numerator, long denumerator)
        {
            if (denumerator == 0)
            {
                throw new System.ArgumentException();
            }

            if (numerator < 0 && denumerator < 0)
            {
                numerator = Math.Abs(numerator);
                denumerator = Math.Abs(denumerator);
            }

            if (denumerator < 0 && denumerator > 0 || denumerator > 0 && numerator < 0)
            {
                numerator = -Math.Abs(numerator);
                denumerator = Math.Abs(denumerator);
            }

            optimise();
        }
    }
}


Когда я хочу распечатать его и делаю Console.Write(new Fraction(1, 2)) или Console.Write(new Fraction(1, 2).ToString()), я получаю пустую консоль вместо ожидаемой строчки. Что я делаю не так?
  • Вопрос задан
  • 130 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
sarapinit
@sarapinit Куратор тега C#
Точу водой камень
у вас ToString определен как
return String.Format("{0}/{1}", this.numerator, this.denumerator);

в нем используются поля класса
но в конструкторе вы поля класса не заполняете

сейчас
if (numerator < 0 && denumerator < 0)
            {
                numerator = Math.Abs(numerator);
                denumerator = Math.Abs(denumerator);
            }

            if (denumerator < 0 && denumerator > 0 || denumerator > 0 && numerator < 0)
            {
                numerator = -Math.Abs(numerator);
                denumerator = Math.Abs(denumerator);
            }


должно быть
if (numerator < 0 && denumerator < 0)
            {
                this.numerator = Math.Abs(numerator);
                this.denumerator = Math.Abs(denumerator);
            }

            if (denumerator < 0 && denumerator > 0 || denumerator > 0 && numerator < 0)
            {
                this.numerator = -Math.Abs(numerator);
                this.denumerator = Math.Abs(denumerator);
            }


Можете помечать приватные поля нижним подчеркиванием, тогда не будете путать их с локальными переменными, например _numerator, _denumerator
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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