6

我做作业时的返回值是多少?

例如,我可以这样做吗?(即赋值返回被赋值的值)

Dim a As Integer = 1
Dim b As Integer = 2
a = b = 3

今天写这段代码的时候出现了一个问题:

Dim updates = GetUpdates()
While updates.Count > 0
    Foo.ApplyUpdates(updates)
    updates = GetUpdates()
End While

我有点希望我能写成这样......

While (updates = GetUpdates).Count > 0
    Foo.ApplyUpdates(updates)
End While

我知道它不是那么干净......(我完全没有声明过updates)但它让我对分配在.NET中的工作方式感到好奇......它是一个有返回值的函数吗?如果是这样......它会返回什么?

编辑

我尝试了第一段代码。看起来编译器将其解释为将 b 和 3 的比较结果分配给 a...,这当然是编译器错误。

而对于第二个代码块,我知道该运算符=没有为任何类型定义updates......即它认为这是一个比较,而不是一个赋值。

所以补充一下我的问题,为什么它会这样工作?仅仅是因为 vb.net 重载了=具有两种含义(赋值和比较)的符号吗?

4

2 回答 2

9

关于分配如何在 .NET 中工作。

这实际上是关于赋值在 VB 中的工作方式,而不是在 .NET 中。

这在 VB.Net 中不起作用。VB.Net 中的= 运算符只是“将其右侧的值分配给其左侧的变量或属性”。

我做作业时的返回值是多少?

如上面的语句所示,赋值运算符在 VB.Net 中不返回值

请注意,这与其他 .NET 语言不同。例如,在 C# 中,赋值= 运算符执行您所描述的操作,并且“将其右侧操作数的值存储在由其左侧操作数表示的存储位置、属性或索引器中,并将该值作为其结果。”

Dim a As Integer
Dim b As Integer
a = b = 3

请注意,Option Strict指定时,这实际上是一个错误:“Option Strict On 不允许从 'Boolean' 到 'Integer' 的隐式转换。”

这是因为 VB.Net 将其视为两个操作 - 它基本上是在尝试这样做:

Dim a As Integer
Dim b As Integer

Dim temp as Boolean
temp = (b = 3)
a = temp

所以补充一下我的问题,为什么它会这样工作?仅仅是因为 vb.net 重载了符号 = 有两种含义(赋值和比较)吗?

嗯,这就是语言的设计方式。不过,我怀疑您是正确的,因为相同的运算符 (=) 被用作赋值,并且比较是 VB 采用这种方式的原因。然而,最初的 VB 语言是这样的,并且为了保持 VB.Net 的语法相同(或尽可能接近),我怀疑这种行为被继承了。

于 2012-08-22T21:23:15.503 回答
4

在 Visual Basica = b = 3中转换为有些出乎意料的东西。由于 VB 没有==运算符,而是=用于赋值和相等比较,所以上面的表达式归结为以下内容:

If b = 3 Then
    a = True
Else
    a = False
End If
于 2012-08-22T21:22:41.733 回答