|
| |||
|
|
"Евреи - не жалейте заварки!" Как известно, в .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. |
||||||||||||||