【问题标题】:Why is a syntax error shown at the "+" sign on the second line?为什么第二行的“+”号处显示语法错误?
【发布时间】:2021-12-13 13:42:59
【问题描述】:

为什么 dlginfo.txtInfo.text 下面的“+”在 Visual Basic 中总是显示语法错误?我该如何解决?

dlgInfo.Show()
dlgInfo.txtInfo.Text = " Nama : " + txtnama.Text + vbCrLf
         " Tanggal Lahir : " + timTanggalLahir.Text + vbCrLf + " Jenis Kelamin : " + jenis_kelamin + vbCrLf + " Agama : " + boAgama.Text + vbCrLf + " Pekerjaan : " + lstPekerjaan.Text + vbCrLf + " Hobi : " + hobi + vbCrLf + " Kendaraan : " + lstKendaraan.Text + vbCrLf + " Motto Hidup : " + txtMottoHidup.Text

【问题讨论】:

  • dlgInfo.txtInfo.Text = " Nama : " + txtnama.Text + vbCrLf 行的末尾没有运算符,因此无法判断下一行与此有关。写dlgInfo.txtInfo.Text = " Nama : " & txtnama.Text & vbCrLf & 可以解决它。 (VB.NET 中的字符串连接运算符是&,不是+,但后者可以。)
  • @AndrewMorton:不幸的是,&+ 都是 valid string concatenation operators。 MS 在 VB.NET 中从 VB Classic 中丢弃了很多东西,但这种奇怪的东西仍然存在。我希望他们也将其删除。我鼓励大家专门使用& 进行字符串连接。
  • @Dai 使用&implicit line continuation 工作的地方之一。
  • @Dai VB.Net 增加了对这几个版本的支持(我认为是 2016 年)。
  • @JoelCoehoorn 早一点:Implicit Line Continuation in VB 2010

标签: vb.net visual-studio visual-studio-2010


【解决方案1】:

问题的三行(包括dlgInfo.Show())中,问题在第二行的结尾和第三行的开头之间。把它们放在一起,你就得到了:

vbCrLf " Tanggal Lahir : "

这两个表达式之间没有运算符。由于那将是无效的语法,因此编译器将第二行解释为已完成的语句,然后开始将第三行作为新语句处理。

现在让我们看看这个新声明的前两个术语:

 " Tanggal Lahir : " + timTanggalLahir.Text

这是一个有效的表达式,它将两个较小字符串中的一个新字符串连接起来。但是,它不能作为声明的开场白。所以我们在+ 操作符处看到了一个语法错误,因为它是无效的操作。这里需要赋值、函数调用或变量声明;不是无处可去的加法或串联。

为了解决这个问题,我们可以在第二行的末尾添加另一个连接运算符:

dlgInfo.txtInfo.Text = " Nama : " + txtnama.Text + vbCrLf +

这将使 VB.Net 知道继续处理下一行作为同一语句的一部分。

或者我们可以压缩它以使用字符串插值,所以它(几乎)适合一行:

dlgInfo.txtInfo.Text = $" Nama : {txtnama.Text}{vbCrLf} Tanggal Lahir : {timTanggalLahir.Text}{vbCrLf} Jenis Kelamin : {jenis_kelamin}{vbCrLf} Agama : {boAgama.Text}{vbCrLf} Pekerjaan : {lstPekerjaan.Text}{vbCrLf} Hobi : {hobi}{vbCrLf} Kendaraan : {lstKendaraan.Text}{vbCrLf} Motto Hidup : {txtMottoHidup.Text}"

但这仍然有点长。我可能会做的是使用内插的多行字符串文字来自然地分隔换行符上的代码,因此代码更接近于目标字符串:

 dlgInfo.txtInfo.Text = 
 $" Nama : {txtnama.Text}
  Tanggal Lahir : {timTanggalLahir.Text}
  Jenis Kelamin : {jenis_kelamin}
  Agama : {boAgama.Text}
  Pekerjaan : {lstPekerjaan.Text}
  Hobi : {hobi}
  Kendaraan : {lstKendaraan.Text}
  Motto Hidup : {txtMottoHidup.Text}"

【讨论】:

  • 另外,我不确定这是否会起作用(我在发布之前had to verify it),所以 TIL 插值字符串和多行字符串文字可以一起工作。
  • 在 Visual Studio 2010 中?
【解决方案2】:

问题是没有任何迹象表明第三行是问题中显示的第二行的一部分-第二行末尾没有二元运算符,例如&

VB.NET 中首选的字符串连接运算符是&,它比操作数之间的+ 运算符多一点。

但是,在这种情况下,如果它使用StringBuilder 创建字符串,它会使代码更易于阅读和维护,特别是因为它有一个 AppendLine 方法,这意味着您不需要继续附加 VbCrLf,像这样:

Imports System.Text
`....
Dim sb As New StringBuilder
sb.AppendLine($" Nama : {txtnama.Text}")
sb.AppendLine($" Tanggal Lahir : {timTanggalLahir.Text}")
sb.AppendLine($" Jenis Kelamin : {jenis_kelamin}")
sb.AppendLine($" Agama : {boAgama.Text}")
sb.AppendLine($" Pekerjaan : {lstPekerjaan.Text}")
sb.AppendLine($" Hobi : {hobi}")
sb.AppendLine($" Kendaraan : {lstKendaraan.Text}")
sb.Append($" Motto Hidup : {txtMottoHidup.Text}")

dlgInfo.txtInfo.Text = sb.ToString()

您可以看到将来修改它会变得多么容易;编写易于维护的代码很重要。让编译器整理出对代码的任何优化,这是它的工作。


如果您使用的是引入内插字符串之前的 Visual Studio 版本(VB14,在 VS2015 中):

Dim sb As New StringBuilder
sb.AppendLine(" Nama : " & txtnama.Text)
sb.AppendLine(" Tanggal Lahir : " & timTanggalLahir.Text)
sb.AppendLine(" Jenis Kelamin :   " & jenis_kelamin)
sb.AppendLine(" Agama : " & boAgama.Text)
sb.AppendLine(" Pekerjaan   " & lstPekerjaan.Text)
sb.AppendLine(" Hobi : " & hobi)
sb.AppendLine(" Kendaraan   " & lstKendaraan.Text)
sb.Append(" Motto Hidup : " & txtMottoHidup.Text)

【讨论】:

    猜你喜欢
    • 2018-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-26
    • 1970-01-01
    • 1970-01-01
    • 2021-10-08
    • 1970-01-01
    相关资源
    最近更新 更多