Может кто-нибудь объяснить правила приоритета, используя C# 6.0? оператор с?? арифметические операции?

Учитывая следующую выдержку:

double value = 10;
string text = null;
double result = value - text?.Length ?? 0;

результат равен 0, и я не могу обернуть голову вокруг фактических операций, происходящих здесь.

Я бы подумал, что результат будет 10 вместо того, чтобы иметь приоритет операторов, как я их понимаю:

  1. ?. оценивается первым
  2. Оператор - должен оценить следующий, так как он имеет больший приоритет, чем??
  3. ?? должен оцениваться последним.

Что здесь происходит?

2 ответа

Решение

Не обманывайтесь новым синтаксисом, это просто вычитание против нуля. Попытка вычесть ноль - это короткое замыкание оператора вычитания, в результате чего сам ноль. Вот почему это сводится к ?? 0 и вы получите 0 в целом. ?? разрешает короткое замыкание. Без этого вы получите очевидную ошибку компилятора.

Например, давайте удалим новый синтаксис и напишем как:

Console.WriteLine(10 - null ?? 0);
// Prints 0

Таким образом, вычитание имеет приоритет, но его результат трансформируется (с учетом нулевого короткого замыкания) из-за введения оператора нулевого слияния.

Лично я чувствую, что вышеупомянутое должно также быть ошибкой компилятора, так как это только имеет такое неоднозначное чувство к этому. Визуально это не имеет смысла, и (по крайней мере, на мой взгляд) я бы не одобрил код, написанный следующим образом. Явные скобки обязательны.

double result = value - text?.Length ?? 0;

это может быть смещено как:

result = (value -  text)==null ? 0
(10 -  null)==null ? 0 
null == null ? 0 

который равен 0

Другие вопросы по тегам