Семантика реализации статического потока находится ниже уровня 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?Это не нужно.