Compile time - выбор в коде, во время компиляции (comple time). То есть, компилятор видит код и понимает, какой тип нужен при создании объекта.
var figure = new Circle(); // тип известен заранее (при компиляции)
Console.WriteLine(figure.CalcArea());
В отличие от compile time. может быть run time - во время работы программы, тип объекта выбирается в зависимости от некоторых условий (ввод пользователя, ответ от сервера, настройки в конфиг-файле, изменилась фаза луны).
Самый простой вариант:
var type = Console.ReadLine();
Figure figure = null;
switch (type.ToLower())
{
case "square": figure = new Square(10); break;
case "rectangle": figure = new Rect(10, 20); break;
case "circle": figure = new Circle(10); break;
}
if (figure != null)
{
Console.WriteLine(figure.CalcArea());
}
else
{
Console.WriteLine("Неверный тип фигуры");
}
Выбор делается в рантайме между заранее известными типами - конкретные возможные типы указаны в коде (в компайлтайме).
Реальный тип (имя класса) можно спросить у пользователя (или из настройки), и вызвать его активатором:
var typeName = Console.ReadLine();
var type = Type.GetType(typeName);
if (type != null)
var figure = (Figure)Activator.CreateInstance(type);
Console.WriteLine(figure.CalcArea());
}
else
{
Console.WriteLine("Неверный тип");
}
Но тип должен быть полным, с пространством имён, то есть, не "Square", а "MyApp.Figures.Square". Таким образом можно создать объект типа, которого вообще не было во время компиляции - например, тип был объявлен в отдельной библиотеке и добавлен в программу после компиляции (так делаются плагины, например). Но для плагинов код будет посложнее.