我从这种方法中得到了奇怪的结果:

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;

10-07 15:42