The answer to 1,2, and 4 is pretty much the same. Extension methods are simply static methods with some special syntactical sugar. This:
public static void DoIt(this string str) {
// ..
}
"test".DoIt();
Is effectively the same IL as:
public static void DoIt(string str) {
// ..
}
DoIt("test");
The former method makes it much easier to provide IntelliSense support though. The restriction of the class needing to be static is probably just a design decision, or maybe performance related.
The answer to #3 is that's just the syntax the language designers chose. C# developers are used to this
refering to the instance object. They could have called it blah
, but it wouldn't have been as obvious as to what the instance object is.
Using the this keyword in an extension method also tells the C# compiler to mark it with the ExtensionAttribute. This attribute is used by consumers of the assembly to find extension methods.