у вас 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