Семантика реализации статических потоков ниже уровня IL в jit-компиляторе .NET. Компиляторам, которые отправляют данные в IL, такие как VB.NET и C #, не нужно ничего знать о Win32 TLS, чтобы генерировать код IL, который может читать и записывать переменную с атрибутом ThreadStatic. Насколько известно C #, в этой переменной нет ничего особенного - это просто место для чтения и записи. Тот факт, что он имеет атрибут, не имеет значения для C #. C # нужно только знать, чтобы выдавать инструкции чтения или записи IL для этого имени символа.
«Тяжелая работа» выполняется основной средой CLR, которая отвечает за работу IL на конкретной аппаратной архитектуре.
Это также объясняет, почему размещение атрибута в несоответствующем (нестатическом) символе не вызывает реакции со стороны компилятора. Компилятор не знает, какая специальная семантика требуется атрибуту. Однако инструменты анализа кода, такие как FX / Cop, должны знать об этом.
Другой способ взглянуть на это: CIL определяет набор областей хранения: статическое (глобальное) хранилище, хранилище элементов и хранилище стека. TLS нет в этом списке, очень вероятно, потому что TLS не обязательно должен быть в этом списке. Если инструкций чтения и записи IL достаточно для доступа к TLS, когда символ помечен атрибутом TLS, почему IL должно иметь какое-либо специальное представление или обработку для TLS? Это не нужно.