Нет перегрузки Thread.VolatileWrite, который принимает аргумент String.Единственный поддерживаемый ссылочный тип - Object.
Поскольку VolatileWrite обновляет переменную str, а Option Strict - On, компилятор жалуется, потому что теоретически VolatileWrite может пытаться записать значение в эту переменную, которая не имеет тип StringКомпилятор видит только, что он может написать любой объект).Фактически, поскольку метод VolatileWrite также принимает только строку, вы можете написать код, который попытается это сделать.По причинам, выходящим за рамки этого вопроса, произойдет сбой.
Когда вы заключаете выражение в выражение COjb / CType / DirectCast (на самом деле что-нибудь с круглыми скобками), тогда переменная больше не считается переменной, а значением -он обрабатывается так же, как если бы вы просто набрали там строковый литерал.Поскольку значения не имеют мест хранения, ByRefness of VolatileWrite игнорируется, что означает, что он больше не записывает, что означает, что он больше не может записывать неверное значение, что означает, что компилятору больше не нужно предупреждать.
Чтобы получитьповедение, которое вы хотите с помощью строкового типа переменной, используйте метод System.Threading.Thread.MemoryBarrier перед записью и после чтения.Смотрите эту ветку для получения дополнительной информации: Как мне указать эквивалент volatile в VB.net?