2016-10-14 5 views
2

Я пытаюсь сделать конвертер, который преобразует метрики в империалы. Также я делаю для него единичный тест. Если я передаю отрицательное значение, метод должен возвращать значение null. Можно ли вернуть null из метода, который возвращает double.Возврат null в методе

public double mgToGrain(double mg)  
{ 

    double grain = mg * myValues["mgTograin"]; 
    return grain; 
    if (mg < 0) { 
     return null; 
    } 
} 

    ` 
+4

Сделать это вернуть 'двойной?' И хорошо ... исправить свой код, чек должен быть перед первым возвращением ... –

+1

Независимо от того, вы можете * * * Я бы не стал *. Я предпочел бы выбросить исключение или вернуть некоторый необязательный объект вокруг двойника. Таким образом, клиент указывает, что возможен результат ошибки, и они должны иметь возможность обрабатывать его –

+1

@Brian, но затем ему может понадобиться ввести метод TryMgToGrain(), который не бросает и не возвращает 'bool'. ..hmmmm .... –

ответ

7

Возможной альтернативой double? в случае, если вы должны придерживаться double является double.NaN (не число):

public double mgToGrain(double mg) { 
    if (mg < 0) 
    return double.NaN; 
    else 
    return mg * myValues["mgTograin"]; 
}  

... 

double x = ... 

if (double.IsNaN(mgToGrain(x))) { 
    ... 
} 
2

Проверить эту статью Nullable Types

public double? mgToGrain(double mg)  
{ 
    return null; 
} 
+0

Cheers. Это помогло – Pae

+0

@Pae отметили ответ как правильный, если вам помогли. – mybirthname

3

Типы значений не может быть пустым. Вы должны использовать Nullable типа, либо путем возврата Nullable<double> или double?

public double? mgToGrain(double mg)  
{   
    if (mg < 0) 
    { 
     return null; 
    } 

    double grain = mg * myValues["mgTograin"]; 

    return grain; 
} 

Также исправлен код, как вы вернетесь из функции перед if.

Here У вас действительно хорошее объяснение о типах значений и null.

+0

Пожалуйста, исправьте его правильно и сделайте функцию спасения перед выполнением расчета. – MarkO

+0

@MarkO благодарит, пропустил этот. – gzaxx

+0

Благодарим вас за помощь. – Pae

1

Вы должны определить свой результат, как обнуляемые и он должен работать (а также двигаться return grain; до конца, в противном случае она возвращает слишком быстро):

public double? mgToGrain(double mg) 
{ 
    double grain = mg * myValues["mgTograin"]; 
    if (mg < 0) { 
     return null; 
    } 
    return grain; 
} 
1

Вы не можете вернуть null от метода, объявленного для возврата double. У вас есть несколько вариантов, сделав API здесь:

  • Вернуться double?, AKA Nullable<double> - этот подход требует звонящих, чтобы проверить значение null до его использования, или применить нулевой сливающихся иметь дело с недопустимыми значениями возврата
  • Выбросить исключение - Этот подход позволит вам продолжить возврат double. Абоненты, которые хотят обрабатывать ошибки потребуется блок
  • в try/catch Вернуть значение, указывающее на успех или неудачу, и настройки результат преобразования в качестве параметра out - это было бы похоже на TryParse и TryGetValue API, в .NET.

Примечание: Перед возвратом из метода вам необходимо проверить отрицательный результат. В вашей текущей реализации код, который проверяет наличие негативов, недостижим.

1

Другие выложили очевидное решение в возвращая обнуляемым двойной, но это еще одно решение.

Альтернативное и, возможно, лучшее решение - выбрасывать исключение, если вход за пределами диапазона. Это имеет тот же эффект, что и не возвращать какое-либо конкретное значение, но также дает обратную связь вызывающему абоненту о том, что конкретно они сделали неправильно, когда они вызвали этот метод.

public double mgToGrain(double mg)  
{ 
    double grain = mg * myValues["mgTograin"]; 
    if (mg < 0) { 
     throw new ArgumentOutOfRangeException("mg must be greater than or equal to 0."); 
    } 
    return grain; 
} 
` 
Смежные вопросы