【问题标题】:Return null in the method在方法中返回 null
【发布时间】:2017-02-23 20:59:30
【问题描述】:

我正在尝试制作将公制转换为英制的转换器。我也在为它做单元测试。如果我传递负值,则该方法应该返回 null。是否可以从返回 double 的方法中返回 null。

public double mgToGrain(double mg)     
{

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

    `  

【问题讨论】:

  • 让它返回 double? 并且好吧...修复你的代码,检查应该在第一次返回之前...
  • 不管你是否可以,我不会。我宁愿抛出一个异常或返回一些可选的实体。这样它就向客户端表明可能出现错误结果,他们应该能够处理它
  • @Brian 但随后他可能需要引入TryMgToGrain() 方法,该方法不会抛出并返回bool...hmmmm....
  • 这个问题绝对不是“什么是可空类型”的重复。它更加具体,因为返回类型 (double) 具有其他内置类型所缺少的功能。投票重新开放。

标签: c# null double


【解决方案1】:

如果您必须坚持使用doubledouble? 的可能替代方案是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 类型,方法是返回 Nullable&lt;double&gt;double?

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

    当您从if 之前的函数返回时,还修复了您的代码。

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

    【讨论】:

    • 请正确修正并在计算前使函数退出。
    • 感谢您的帮助。
    【解决方案3】:

    查看这篇文章Nullable Types

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

    【讨论】:

    • 干杯。这有帮助
    【解决方案4】:

    您不能从声明为返回double 的方法返回null。您可以在此处创建 API 的多种选择:

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

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-11-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-01-24
          相关资源
          最近更新 更多