VB 等效于 C# 空合并运算符 - 特定情况

VB equivalent of C# null coalescing operator - specific case

我知道之前有人问过类似的问题:

但那里没有解决我的问题。在 C# 中我可以这样写:

return myFoo ??= new Foo() 

如果myFoo为null,这一行将创建一个新的Foo,将其分配给myFoo return myFoo.

的值

我想将其翻译成 VB。我可以用两个语句来完成,例如:

If myFoo Is Nothing Then myFoo = New Foo()
Return myFoo

甚至使用双参数 If 函数:

myFoo = If(myFoo, New Foo())
Return myFoo

我更愿意在一个声明中完成。这个看起来应该等同于 C# 版本:

Return myFoo = If(myFoo, New Foo())

但它不起作用,因为它将 = 解释为比较器,而不是赋值。

有没有优雅的解决方案?

C 继承语言(包括 C#)历来将赋值视为 表达式,这意味着它有一个结果。从历史上看,该结果是分配的值。这具有优势,包括允许更简洁的多重赋值和测试条件赋值的结果。它也有缺点,包括条件中赋值和相等运算符的潜在混淆。

其他语言将赋值视为语句,这意味着它没有结果并且不能组合成另一个操作。 VB 是其中一种语言(其他语言包括 Fortran 和 Pascal)。

因为赋值是 VB 中的语句,除非您编写自己的函数来这样做,否则您不能在同一操作中进行赋值和测试。您将不得不执行两行操作,或者使用 : 语句分隔符将两个语句放在一行中。

关于 VB 与语言家族相关的闲散好奇心:pre-.NET,VB 与 Fortran 的共同点多于 C。结束块语句遵循与 Fortran 相同的约定,代码编辑器将识别 EndIf 并将其转换为 End If,数组布局相同(列优先而不是行优先),并且代码编辑器将识别 Fortran 约定的双-精度常数,例如1.0d0 将被视为双 1.0。最后两个随着迁移到 .NET 而丢失。