Какова последовательность этой встроенной нулевой проверки и оценки сложения? - PullRequest
0 голосов
/ 05 июля 2018

Я не могу придумать лучшего заголовка, но эта ошибка заняла у меня много времени.

Может кто-нибудь объяснить мне, почему это дает мне разные результаты?

string may = "May";
string june = "June";
string july = "July";
Console.WriteLine(may?.Length ?? 0  + june?.Length ?? 0 + july?.Length ?? 0) ;
Console.WriteLine(may == null ? 0 : may.Length  + june == null ? 0 : june.Length + july == null ? 0 : july.Length) ;
Console.WriteLine( (may == null ? 0 : may.Length)  + (june == null ? 0 : june.Length) + (july == null ? 0 : july.Length)) ;

Я прошел через это, и в своей голове я просто не могу понять, что, черт возьми, происходит. Какова последовательность оценки здесь?

Я бы ожидал, что логика слияния нулевой строки или троичная логика будет выглядеть примерно так (что работает, кстати!):

int tempRes = 0;

tempRes+=may == null ? 0 : may.Length;
tempRes+=june == null ? 0 : june.Length;
tempRes+=july == null ? 0 : july.Length;

Console.WriteLine(tempRes);

1 Ответ

0 голосов
/ 05 июля 2018

Это не столько последовательность вычислений, сколько приоритет операторов.

may?.Length ?? 0  + june?.Length ?? 0 + july?.Length ?? 0

Это означает:

may?.Length ?? (0  + june?.Length) ?? (0 + july?.Length) ?? 0

что явно не то, что вы хотите. То, что вы хотите, можно выразить как

(may?.Length ?? 0) + (june?.Length ?? 0) + (july?.Length ?? 0)

Аналогично,

may == null ? 0 : may.Length  + june == null ? 0 : june.Length + july == null ? 0 : july.Length

означает

may == null ? 0 : ((may.Length  + june) == null ? 0 : ((june.Length + july) == null ? 0 : july.Length))
...