1

将参数包装在 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
4

1 回答 1

1

没有采用 String 参数的 Thread.VolatileWrite 的重载。唯一支持的引用类型是 Object。

因为 VolatileWrite 正在更新变量 str 并且 Option Strict 是 On 编译器抱怨,因为理论上 VolatileWrite 可能会尝试向该变量写入一个非字符串类型的值(编译器只看到它可能写入任何对象)。事实上,由于 VolatileWrite 方法也只接受一个字符串,因此您可以编写尝试执行此操作的代码。由于超出此问题范围的原因,它会失败。

当您将表达式包装在 COjb/CType/DirectCast 表达式(实际上是带括号的任何内容)中时,该变量不再被视为变量而是值 - 它的处理方式与您在此处键入字符串文字的方式相同。由于值没有存储位置,因此 VolatileWrite 的 ByRefness 被忽略,这意味着它不再写入,这意味着它不能再写入错误值,这意味着编译器不再需要警告。

要使用字符串类型变量获得所需的行为,请在写入之前和读取之后使用 System.Threading.Thread.MemoryBarrier 方法。有关更多信息,请参阅此线程:如何在 VB.net 中指定 volatile 的等效项?

于 2011-08-01T18:50:09.513 回答