Примечание: Обратите внимание, что приведенный ниже код по существу не имеет смысла и просто для иллюстрации.
Исходя из того факта, что правая часть присваивания всегда должна быть оценена до того, как ей присваивается значение левой стороне переменной, а операции с приращением, такие как ++
и --
, всегда выполняются правильно после оценки я не ожидал, что следующий код будет работать:
string[] newArray1 = new[] {"1", "2", "3", "4"};
string[] newArray2 = new string[4];
int IndTmp = 0;
foreach (string TmpString in newArray1)
{
newArray2[IndTmp] = newArray1[IndTmp++];
}
Скорее, я ожидал бы, что newArray1[0]
будет присвоен newArray2[1]
, newArray1[1]
- newArray[2]
и т.д. до точки бросания System.IndexOutOfBoundsException
. Вместо этого, и к моему большому удивлению, версия, которая генерирует исключение, составляет
string[] newArray1 = new[] {"1", "2", "3", "4"};
string[] newArray2 = new string[4];
int IndTmp = 0;
foreach (string TmpString in newArray1)
{
newArray2[IndTmp++] = newArray1[IndTmp];
}
Так как, по моему мнению, компилятор сначала оценивает RHS, присваивает его LHS и только затем увеличивает это, это для меня неожиданное поведение. Или это действительно ожидаемо, и я явно что-то пропустил?