在 VB 中,对象变量需要分配 Set 关键字。作为对象的对象属性也需要为Set。当分配不使用该关键字时,会引发运行时错误 91“未设置对象变量”。
这是继承自旧的Let 关键字以分配值,以及Set 关键字以分配引用; Let 最终被弃用(尽管仍然需要定义属性),Set 仍然存在,留下了像 [Let] variable = value 这样的 VB6/VBA 值赋值语法,其中“Let”是可选的。
在声明和赋值中:
Dim SourceWindow As Window, QACheckWindow As Window
'this is like saying "Let SourceWindow = ActiveWindow":
SourceWindow = ActiveWindow
SourceWindow 是一个 object,就像它是一个 value 一样分配 - 这会导致 VBA 通过 let-coercion 尝试 em>默认成员调用。如果对象未初始化,则成员调用失败并出现错误 91。如果对象已初始化但没有 默认成员,则会引发错误 438。
所以在这种情况下,由于隐式成员调用而引发了错误 91; .net 等价物将是 NullReferenceException:
Dim SourceWindow As Window, Dim WindowTitle As String
'"SourceWindow" reference isn't set, the object can't be accessed yet:
WindowTitle = SourceWindow.Caption
我在这里有点过火了,但旧的Let 声明不应与Let 子句混淆(在VB.net中) 在 LINQ 查询语法(在 VB.net 中)中,计算一个值并将其分配给一个新的、查询范围的变量(示例取自 MSDN):
From p In products
Let Discount = p.UnitPrice*0.1 '"Discount" is only available within the query!
Where Discount >= 50
Select p.ProductName, p.UnitPrice, Discount
VB.net 分配 values 和 references,而无需指定 Let 或 Set,因为在 .net 中这种区别非常重要更细的线,考虑到一切最终如何源自System.Object...包括System.ValueType。这就是the Set keyword was also deprecated in VB.net 的原因,也是 VB.net 定义属性的语法放弃了 Let 以支持 Set 的原因 - 因为无参数 默认成员 在 VB.NET 中是非法的,所以这模棱两可的 let-coercion 不会发生。