Я боролся с проблемами, которые вы поднимали в течение бесчисленных часов за последние несколько лет. Детальное обсуждение всех поднятых вами вопросов заняло бы у меня несколько часов, чтобы напечатать, поэтому я просто подведу итог:
Во-первых, оказывается, что даже с тем условием «временно предположить, что он является объектом», который мы с Мэдсом добавили, чтобы попытаться ужесточить этот раздел спецификации, этот раздел спецификации все еще недостаточно обоснован. Бит «как связать имя с типом» спецификации предполагает, что все отношения вложенности и наследования известны и непротиворечивы в момент, когда происходит поиск, но, конечно, это не может быть так, поскольку вся причина, по которой мы поиск имени в первую очередь должен определить базовый тип. Если бы у меня были свои заметки со мной, я мог бы дать вам несколько примеров сумасшедших иерархий типов, в которых комбинации обобщенных типов, вложений, интерфейсов и базовых классов ставят компилятор в ситуации, когда то, как вы определяете, что означает данное имя, зависит от порядка, в котором Вы выясняете базовые классы.
Очевидно, что это не очень хорошее место для жизни. Мы не хотим, чтобы смысл программы на C # отличался при изменении порядка классов в файле!
Во-вторых, мы ограничены тем, что может быть представлено в метаданных.
В-третьих, исторически мы были ограничены тем, что может эффективно передаваться в метаданные. Предыдущие версии отправителей метаданных имели проблемы с производительностью или правильностью, если вы пытались создавать производные типы перед базовыми или внутренними типами перед внешними типами. (Я попытался в C # 4 решить эту проблему, написав топологический сортировщик, который нашел бы эффективное упорядочение, если бы оно существовало, но изменение оказалось достаточно сложным и опасным, поэтому мы решили не принимать его до Roslyn. В Roslyn мы используем совершенно другой излучатель.)
В-четвертых, редко встречаются такие топологии в реальном производственном коде; Вы, очевидно, исключение из этого правила.
В-пятых, одна из наших основных целей для языка - сделать его языком «ямы качества», где его особенности приводят к написанию программ, которые являются как правильными, так и понятными. Разрешение видов сумасшедших «любопытно повторяющихся» шаблонов, которые вы видите в шаблонах C ++, явно не является целью команды языка C #. Мы не заинтересованы в предоставлении теоретически полной системы типов; Мы заинтересованы в том, чтобы облегчить представление о том, что Сотрудник - это своего рода Человек.
Все эти факторы работают против того, чтобы сделать цикличности в отношениях базового класса и вложенного класса более законными Как бы мне лично не хотелось создавать хорошо обоснованную систему для разрешения циклических операций в базовых типах таким образом, чтобы не нарушать существующий код, это не является достаточно высоким приоритетом; у нас есть длинный список вещей, которые мы хотим улучшить для Roslyn, и алгоритм разрешения базового класса далек от верха этого списка.