Ответ 1
&
и |
являются строгими, а &&
и ||
являются короткозамкнутыми:
false && (throw new Exception()) => false
false & (throw new Exception()) => ex
true || (throw new Exception()) => true
true | (throw new Exception()) => ex
В полной документации для &
и |
есть примечание, объясняющее это поведение:
Этот метод оценивает как a, так и b, даже если результат уже определяется после оценки a.