Вы, похоже, задаете два разных вопроса: первый - почему нет оператора для поиска объявленного типа переменной, а другой - почему typeof (o) не может быть эквивалентом o.GetType () .
Во-первых, причина в том, что это не имеет смысла, объявленный тип переменной по определению всегда известен во время компиляции. Добавление оператора для него не добавит значения.
С другой стороны, проблема в том, что использование typeof (instance) вызывает проблемы с разрешением. Как упоминал Джейсон выше, рассмотрим:
public class Animal {}
string Animal;
Type t = typeof(Animal);
Что такое т? Если вы трактуете t как typeof (string) , то вы просто добавляете в язык существенные критические изменения. Представьте себе весь код, который в настоящее время предполагает, что t является Animal, что в настоящее время правильно.
Если вы рассматриваете t как typeof (Animal) , тогда ваш код невероятно хрупок. Представьте себе ситуацию, когда не было класса Animal, когда вы писали код, но год спустя кто-то добавил класс Animal в какое-то пространство имен, которое вы импортировали. Ваш код будет поврежден, потому что правила разрешения теперь будут использовать тип Animal, а не локальную переменную.