Simple: The Main method is always static - there is only ever one of these (or the framework wouldn't know which instance to run on startup), so it runs fine. But, it is static, which means it is not attached to any instance, and so has no
this
pointer, either implied or specified. As a result, you cannot use "i" because it is not a static property, and requires a specific instance to give you the
this
pointer.
When you do this:
cl obj = new cl();
you create an instance of the "cl" class, referred to by a variable within Main, called "obj". Because it is an instance, it can have all the properties it needs, and it persisted until it goes out of scope - in this case by the code reaching the end of the Main method.
If you couldn't do this, you could never instantiate any class, and your program would have to be very short, and boring!