Здесь следует отметить, что когда C# выполняет присвоение (помещает значение в переменную), он также возвращает значение, которое было присвоено. Это:
age = 20
Возвращает значение, 20
Вы можете использовать это в другом назначении:
score = age = 20;
Возраст равен 20, потому что мы присвоили ему значение и он вернул 20. Оценка также равна 20, потому что мы присвоили ему возвращаемое значение (age = 20). Присвоение (результат присвоения возраста) баллов также вернуло значение ... и мы могли бы go так всегда:
a=b=c=d=e=f...=x=y=z=20; //all 26 variables now have a value of 20
Мы можем рассматривать возвращаемые значения как элементы суммы, как и любые другие:
score = (age = 20) + 1;
Присваивает 20 возрасту и 21 баллу и возвращает 21
Мы можем изменять типы, точно так же, как мы можем сказать myString = 20.ToString()
(да, вы можете вызывать методы для константы так же, как вы можете для переменной), мы можем сказать это:
myString = (score = (age = 20) + 1).ToString();
Назначает 20 to age, 21 to score затем превращает возвращенный 21 в строку и присваивает "21" myString
-
Хорошо, хватит этой глупости ... но, надеюсь, вы понимаете, почему
if(age = 20 && score < 50)
Выдает ошибку. age
установлено в 20, возвращается 20 и &&
редактируется с (score <50), операцией, которая возвращает логическое значение. Это означает, что вы написали это так: </p>
age = 20;
if(20 && score < 50)
Какой простой не работает. Хорошая работа, это не JavaScript.
И, конечно же, скорее всего, вы хотели использовать ==
для сравнения возраста, а не =
для выполнения задания ..
.. просто помните, что присваивания тоже приводят к значениям, поэтому этот сумасшедший вид l oop работает:
while(null != x = stream.Read()) //loop while Read() doesn't return null
{
//use x, which certainly has a non null value
}
Я бы проявил осторожность при использовании составного присваивания заявления -и-сравнение - они намного менее читабельны, чем перечисление этих вещей шаг за шагом:
for(x = stream.Read(); x != null; x = stream.Read())