Как и @Jon Skeet, эта проблема имеет приоритет и может быть решена путем явного определения правильного приоритета с помощью скобок.(например, (Depth - (StartDepth ?? Globals.StartDepth)) * PrintScale ?? Constants.YPixelsPerUnit;
)
Эта концепция не сразу очевидна, и способ приоритет , ассоциативность и порядок оценки работают в C #не всегда интуитивно понятен
Эрик Липперт очень хорошо объясняет эти понятия в своей статье Приоритет против ассоциативности против порядка .Я настоятельно рекомендую прочитать эту статью.Ниже приведены наиболее важные выдержки:
Приоритет
Правила приоритета описывают, как выражение в скобках должно быть заключено в скобки, когда выражение смешивает операторы разных типов.Например, умножение имеет более высокий приоритет, чем сложение, поэтому 2 + 3 x 4 эквивалентно 2 + (3 x 4), а не (2 + 3) x 4.
Ассоциативность
Правила ассоциативности описывают, как выражение, заключенное в скобки, должно заключаться в скобки, когда выражение имеет группу операторов одного типа.Например, сложение ассоциативно слева направо, поэтому a + b + c эквивалентно (a + b) + c, а не a + (b + c).В обычной арифметике эти два выражения всегда дают один и тот же результат;в компьютерной арифметике они не обязательно.(В качестве упражнения вы можете найти значения для a, b, c такие, что (a + b) + c не равно a + (b + c) в C #?)
Порядок оценки
Порядок правил оценки описывает порядок, в котором оценивается каждый операнд в выражении.Скобки просто описывают, как результаты группируются вместе;«делать круглые скобки первыми» не является правилом C #.Скорее, правило в C # «оценивать каждое подвыражение строго слева направо».