在方法中返回null

时间:2016-10-14 12:17:46

标签: c# null double

我试图制作将指标转换为英制的转换器。我也正在进行单元测试。如果我传递负值,该方法应该返回null。是否可以从返回double的方法返回null。

public double mgToGrain(double mg)     
{

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

    `  

6 个答案:

答案 0 :(得分:7)

如果您必须坚持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))) { ... } 非数字):

Your deployment target has to be moved up to the highest minimum target required by any dependency.

答案 1 :(得分:4)

值类型不能为null。您必须使用Nullable类型,方法是返回Nullable<double>double?

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

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

   return grain;
}

if之前从函数返回时修复代码。

Here你对值类型和null有很好的解释。

答案 2 :(得分:2)

查看此文章Nullable Types

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

答案 3 :(得分:1)

您必须将结果定义为可为空且它应该有效(并且还将return grain;移到最后,否则返回得太快):

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

答案 4 :(得分:1)

您无法从声明为返回null的方法返回double。您可以在此处制作API的几个选项:

  • 返回double?,AKA Nullable<double> - 此方法要求调用者在使用之前检查null的值,或应用null合并来处理返回值无效
  • 抛出异常 - 此方法可让您继续返回double。想要处理错误的来电者需要try / catch阻止
  • 返回一个表示成功或失败的值,并在out参数中设置转换结果 - 这类似于TryParseTryGetValue API。 NET。

注意:您需要在从方法返回之前检查否定值。在您当前的实现中,检查否定的代码是无法访问的。

答案 5 :(得分:1)

其他人已经发布了返回 nullable double的明显解决方案,但还有另外一个需要考虑的解决方案。

另一种可能更好的解决方案是在输入超出范围时抛出异常。这对于不返回任何特定值具有相同的效果,但它也向调用者提供反馈,告诉他们在调用方法时他们做错了什么。

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;
}
`