Важно понимать, что все, что делает компилятор, - это берет исходный язык (в данном случае C #), анализирует его, чтобы компилятор имел представление, которое имеет смысл для него, а не для людей (это абстрактное синтаксическое дерево), и затем выполняет наивную генерацию кода для целевого языка (msil является целью для языков, работающих в среде выполнения .NET).
Теперь, если код script # превращен в сборку и взаимодействует с другим кодом .NET, это означает, что этот компилятор должен генерировать msil. скрипт # использует для этого csc.exe, который является просто стандартным компилятором c #. Теперь, чтобы сгенерировать javascript, он должен взять c # или msil, проанализировать его и сгенерировать javascript для отправки в браузер. В документации сказано, что у него есть собственный компилятор c # -> js под названием ssc.exe.
Для того, чтобы вещи согласованно взаимодействовали как на стороне клиента, так и на стороне сервера, он имеет набор эталонных сборок, которые написаны на .NET, но также скомпилированы в javascript. Это не специфическая проблема компилятора, эти ссылочные сборки являются скриптом # runtime. Время выполнения, вероятно, ответственно за большую часть сценария # магии, которую вы воспринимаете.