我试图制作将指标转换为英制的转换器。我也正在进行单元测试。如果我传递负值,该方法应该返回null。是否可以从返回double的方法返回null。
public double mgToGrain(double mg)
{
double grain = mg * myValues["mgTograin"];
return grain;
if (mg < 0) {
return null;
}
}
`
答案 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
参数中设置转换结果 - 这类似于TryParse
和TryGetValue
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;
}
`