我从这种方法中得到了奇怪的结果:
public static double YFromDepth(double Depth, double? StartDepth, double? PrintScale)
{
return (Depth - StartDepth ?? Globals.StartDepth) * PrintScale ?? Constants.YPixelsPerUnit ;
}
当我将空值传递到 StartDepth 时,合并失败,因为“Depth - StartDepth”正在通过首先将 StartDepth 转换为默认值 0(降级?)而不是首先查看它是否为空值并在全局变量中替换来评估。 StartDepth 代替。
这是众所周知的事情吗?我能够通过添加括号来完成这项工作,但我真的没想到事情会这样工作。
最佳答案
不,这不是错误。这是 specified order of precedence - 二进制 -
运算符的优先级高于 ??
,因此您的代码有效:
return ((Depth - StartDepth) ?? Globals.StartDepth) *
PrintScale ?? Constants.YPixelsPerUnit;
如果您不想要该优先级,则应明确指定它:
return (Depth - (StartDepth ?? Globals.StartDepth)) *
PrintScale ?? Constants.YPixelsPerUnit;
我个人会扩展该方法以使其更清晰:
double actualStartDepth = StartDepth ?? Globals.StartDepth;
double actualScale = PrintScale ?? Constants.YPixelsPerUnit;
return (depth - actualStartDepth) * actualScale;