什么是函数调用的合法用例在赋值的左侧?

时间:2017-07-04 14:24:57

标签: vba compiler-errors

VBA中存在编译错误,如下所示:

Function call on left-hand side of assignment must return Variant or Object

  

编译错误:

     

赋值左侧的函数调用必须返回Variant或Object。

要产生此编译错误,您只需要一个函数:

Public Function Foo(ByVal x As Integer) As Integer
    Foo = x
End Function

..然后在作业左侧的函数调用 - 例如:

Public Sub Test()
    Foo(42) = 12
End Sub

如果我从函数签名中删除As Integer返回类型,我会得到一个返回隐式Variant的函数,并且编译器满意 - 但现在有了#sa; sa运行时错误424 /"对象必需"。

所以我让函数返回一个实际的对象:

Public Function Foo(ByVal x As Integer) As Object
    Dim result As Collection
    Set result = New Collection
    result.Add x
    Set Foo = result
End Function

Public Sub Test()
    Foo(42) = 12
End Sub

现在在运行时错误是438 /"对象不支持此属性或方法" - 显然,Test方法没有任何意义。

在我的生活中,我不能想到任何在作业的LHS上使用函数调用的有效,合法(并且有理由?)

由于某种原因存在编译错误,因此必须才是有效的用例。它是什么?

2 个答案:

答案 0 :(得分:4)

如果该函数要返回Variant,并且Variant包含Object(即Variant类型为VT_DISPATCH),该对象具有默认"属性put",则赋值有效,并且赋值设置为该默认属性。

在所有其他情况下,它不是。

答案 1 :(得分:1)

VB变体类似于C#中的dynamic,这意味着该类型在运行时动态解析。因此,您可以为变量类型赋值(即返回变量类型的函数的返回值)是有意义的。

我认为用例非常狭窄,99.9%的时间,如果你试图这样做,你做错了。

https://msdn.microsoft.com/VBA/Language-Reference-VBA/articles/function-call-on-left-hand-side-of-assignment-must-return-variant-or-object