As all textbooks on C# will tell you, you cannot instantiate an abstract class. I believe the keyword abstract was intended for that purpose. So can anyone tell me why I can do something like this: abstract class TwoDShape { // some code here } class test { static void Main() { TwoDShape shape = new TwoDShape(); // this gives an error TwoDShape[] shapes = new TwoDShape[4]; // this is OK } }