Можно написать
Code Analyzer, который будет выдавать ошибку компиляции в случае использовании переменной внутри блока, помеченного каким-либо способом, например специальным комментарием с именами запрещенных переменных:
int i = 0;
// HIDE: i
for(int j=0; j<=N; j++) {
if(elem[i]==null) { // Ошибка компиляции: использование запрещённой переменной.
}
}
// SHOW: i
i++; // Нет ошибки.
или блоком using:
int i = 0;
using (CompilerUtils.HideVar(i))
{
for(int j=0; j<=N; j++){
if(elem[i]==null) { // Ошибка компиляции: использование запрещённой переменной
}
}
}
i++; // OK.
Сам код HideVar может не делать ничего:
public static class CompilerUtils
{
public static IDisposable HideVar(params object[] vars)
{
return <пустая реализация IDisposable>;
}
}