'kick' is declared in the main method's block and that includes any nested blocks. So, your code is valid. The other way around, a declaration in an 'inner block' is not known in an 'outer block':
public static void Main()
{
{
A kick = null;
kick = new A();
}
kick.HelloFromA();
}
The garbage collector cleans up kick after it goes 'out of scope' but you just don't know when (most likely not immediately).