| |||
![]()
|
![]() ![]() |
![]()
"Евреи - не жалейте заварки!" Как известно, в .NET-e такой код прекрасно работает: using System; namespace Vars { class Vars { public static void For (int l, int u, ActionТакже известно, что мелкомягкие скоммуниздили из Паскаля Var-параметры (ref и out), что позволило им (как собственно и Вирту) решить проблему безопасной передачи переменных по ссылке: указатели типа С увы страдают тем, что их можно присвоить переменной с временем жизни большим чем запись активации функции, где эта переменная находится - и здравствую висячая ссылки и segfault. Var-ссылки этим недостатком не страдают потому как их время жизни гарантировано меньше. Умный Вирт однако понимал, что процедурные параметры тоже нужны и сделал еще аналогичный спецификатор для параметров процедур. Чего мелкомягкие не скоммуниздили - и закономерно огребли: Вот такое уже не работает: public static void SumNat (int to, ref int s) { For (1, to, (i) => { s += i; }); } public static void Main (string[] args) { var s = 0; SumNat (10, ref s); Console.WriteLine ("N={0}", s); }Говорит: Error CS1628: Parameter `s' cannot be used inside `lambda expression' when using `ref' or `out' modifier (CS1628) (Vars) А такое разумеется фиксит: public static void SumNat (int to, ref int s) { var ss = s; For (1, to, (i) => { ss += i; }); s = ss; }Природа явления imho вполне понятна (если кому-то непонятна - пишите - поясню), но вот стандартные же грабли - сделать "ограниченный" спецификатор для параметра-указателя на переменную и не сделать того же самого для параметра-функции.... В общем - subj. |
||||||||||||||
![]() |
![]() |