Как я могу использовать Thread.VolatileWrite со ссылочными типами с Option Strict On? - PullRequest
1 голос
/ 20 апреля 2011

Завершение аргумента в CObj или DirectCast закрывает компилятор, но значение по-прежнему не записывается.

Option Strict On
Imports System.Threading
Module Module1
    Dim str As String
    Sub Main()
        Thread.VolatileWrite(str, "HELLO") ' Compiler error.
        Thread.VolatileWrite(CObj(str), "HELLO") ' Fails silently.
        Thread.VolatileWrite(DirectCast(str), "HELLO") ' Fails silently.
        Console.WriteLine(str)
    End Sub
End Module

1 Ответ

1 голос
/ 01 августа 2011

Нет перегрузки 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?

...