2016-04-03 4 views
1

Я только изучаю C# и не могу понять, что не так с этим кодом.Значение типа 'int' не может использоваться

CS1750 Ошибка Значение типа «INT» не может быть использован в качестве параметра по умолчанию, потому что нет стандартных преобразований с типом «MidpointRounding»

Код:

public static double MyRound(double value, int point, MidpointRounding midpointRounding = 1) 
{ 
    if (!Enum.IsDefined(typeof (MidpointRounding), midpointRounding)) 
     throw new ArgumentOutOfRangeException(nameof(midpointRounding)); 

    decimal num = (decimal)((double)value); 

    try 
    { 
     num = Math.Round(num, point, midpointRounding); 
    } 
    catch (Exception exception1) 
    { 
     Exception exception = exception1; 
     MessageBox.Show(exception.Message, "Error : MyRound", MessageBoxButton.OK, MessageBoxImage.Hand); 
    } 

    return (double)((double)num); 
} 
+1

На какой линии вы его получите? –

+3

у вас есть ясное сообщение об ошибке, сообщающее вам, что является нарушением утверждения/строки. что вы ожидаете от этого? – kai

+2

@VisualVincent сообщение об ошибке говорит, что это объявление функции (поскольку оно говорит о параметрах по умолчанию) – kai

ответ

7

Последние параметр имеет тип MidpointRounding, который является перечислением. Единственный литерал int, который вы можете неявно назначать перечислению, - 0. Вы предоставили по умолчанию значение 1, о чем жалуется компилятор.

Вместо этого используйте MidpointRounding.ToEven, если это то, что вы имели в виду.

Некоторые другие наблюдения:

  • Нет необходимости проверять, если midpointRounding находится в диапазоне, Math.Round will take care of that.
  • Не показывать окна сообщений из исключений, это не очень хороший подход, он смешивает код пользовательского интерфейса с логическим кодом. Вы должны разрешить распространение исключения, если оно есть.
  • Вы писали return (double)((double)num);, один бросок будет достаточно;)
  • Нет необходимости бросить (double)value, а value уже double
  • Наконец ... Кастинг double к decimal, округление его с данным методом, то отбрасывание его обратно до double составляет не хорошая идея. Вы потеряете точность, и метод округления средней точки, скорее всего, будет побежден. Используйте decimal все время, если метод округления средней точки имеет важное значение.
Смежные вопросы

 Смежные вопросы