Я знаю, что || и && определены как операторы короткого замыкания на С#, и такое поведение гарантируется спецификацией языка, но также |= и &= короткое замыкание?
Например:
private bool IsEven(int n)
{
return n % 2 == 0;
}
private void Main()
{
var numbers = new int[] { 2, 4, 6, 8, 9, 10, 14, 16, 17, 18, 20 };
bool allEven = true;
bool anyOdd = false;
for (int i = 0; i < numbers.Length; i++)
{
allEven &= IsEven(numbers[i]);
anyOdd |= !IsEven(numbers[i]);
}
}
При попадании 9 записей allEven становится ложным, что означает, что все последующие записи не имеют значения - значение allEven гарантируется как ложное для всех будущих вызовов этого выражения. То же самое относится к anyOdd, который установлен в true, когда видит 9, и останется верным для всех последующих вызовов этого выражения.
Итак, выполняются ли &= и |= ярлыки, или IsEven гарантированно вызывается на каждой итерации? Есть ли какое-либо определенное поведение в спецификации языка для этого случая? Существуют ли какие-либо угловые случаи, когда такое короткое замыкание будет проблематичным?