VB.NET字符串连接:编译器错误?

VB.NET字符串连接:编译器错误?,.net,vb.net,compiler-errors,.net,Vb.net,Compiler Errors,问题: 以下程序引发运行时错误(从double转换无效),因为存在 + _ 然后是一个新行和一个 +" 换句话说,它是 "SomeString" + "someotherstring" ++ "yet another string" 它可以很好地编译,但当程序运行时,会抛出运行时错误。 这是编译器错误吗? 它不应该因为编译器错误而阻止我吗,比如无效语法?尝试在vb.net中使用&作为连接运算符,这将导致编译错误,而不启用选项Strict。我认为发生的情况是,由于运营商之间没有内容,它

问题:

以下程序引发运行时错误(从double转换无效),因为存在

 + _
然后是一个新行和一个

 +"
换句话说,它是

"SomeString" + "someotherstring" ++ "yet another string"

它可以很好地编译,但当程序运行时,会抛出运行时错误。
这是编译器错误吗?

它不应该因为编译器错误而阻止我吗,比如无效语法?

尝试在vb.net中使用
&
作为连接运算符,这将导致编译错误,而不启用
选项Strict
。我认为发生的情况是,由于运营商之间没有内容,它使用第二个
+
作为数字的符号(例如
+1
)。由于VB默认的隐式转换行为,它会尝试将字符串文字转换为数字


使用
选项Strict On
将导致显示编译器错误。

尝试在vb.net中使用
&
作为连接运算符,这将导致编译错误,而不启用
选项Strict
。我认为发生的情况是,由于运营商之间没有内容,它使用第二个
+
作为数字的符号(例如
+1
)。由于VB默认的隐式转换行为,它会尝试将字符串文字转换为数字


使用
选项Strict On将导致显示编译器错误。

运算符有两种变体:

  • 二进制运算符,
    a+b
  • 一元运算符,
    +a
第一个表示“取
a
并添加
b
并生成结果”。第二个写着“拿一个带正号的
a”

在这种情况下,表达式的计算结果为字符串+双精度,因为VB.NET在使用
选项STRICT OFF
时会认为您希望第二个操作数是字符串,在运行时会自动转换为双精度,因为您在它前面加了一元
+
运算符


在上设置
选项STRICT,使VB.NET在编译时对其类型检查更加严格,但在某些情况下,您必须编写更具体的代码。

运算符有两种变体:

  • 二进制运算符,
    a+b
  • 一元运算符,
    +a
第一个表示“取
a
并添加
b
并生成结果”。第二个写着“拿一个带正号的
a”

在这种情况下,表达式的计算结果为字符串+双精度,因为VB.NET在使用
选项STRICT OFF
时会认为您希望第二个操作数是字符串,在运行时会自动转换为双精度,因为您在它前面加了一元
+
运算符


设置
OPTION STRICT ON
以使VB.NET在编译时对其类型检查更加严格,在某些情况下,您必须编写更具体的代码。

尝试启用
OPTION STRICT
@Lasse V.Karlsen:是的,OPTION STRICT ON捕捉到了这一点,但它也会引发很多其他的隐式转换错误,这些错误实际上并不存在。你的意思是:编译器会抱怨很多其他转换,直到运行时才进行,这实际上可能不会产生错误。由于运算符优先级,编译器实际上可能不会费心去弄清楚它是否是一个数字,因为它可能会首先计算
字符串+dr[…]
部分,因此不确定结果会是什么。不过,现在您知道了如何消除该警告,而且新的VB.NET程序应该公平地使用
选项编写,并严格遵循
。请参阅。我建议严格=开,推断=关,明确=开。这是更多的工作,但最终还是值得的。另外,使用&进行字符串连接。尝试启用
Option Strict
@Lasse V.Karlsen:是的,Option Strict on捕捉到了这一点,但它也引发了许多其他隐式转换错误,而这些错误实际上并不存在。您的意思是:编译器会抱怨在运行时之前,您会忽略很多其他转换,这实际上可能不会产生错误。由于运算符优先级的原因,编译器实际上可能不会费心计算它是否可能是一个数字,因为它可能会首先计算
字符串+dr[…]
部分,因此不确定结果会是什么。不过,现在您知道了如何消除该警告,而且新的VB.NET程序应该公平地使用
选项编写,并严格遵循
。请参阅。我建议严格=开,推断=关,明确=开。这是更多的工作,但最终还是值得的。另外,使用&进行字符串连接。请注意,
&
会隐式地向字符串添加加宽转换,即使
选项对
要求严格。这些可能会造成麻烦,尽管它们不会对这个问题产生任何影响。请注意,
&
会隐式地向字符串添加加宽转换,即使
选项严格限制在
上。这些可能会令人讨厌,尽管它们不会对这个问题产生任何影响。
<STAThread()> _
Sub Main()
    Dim sb As System.Text.StringBuilder = New System.Text.StringBuilder

    Dim dt As New DataTable
    dt.Columns.Add("oeId", GetType(String))
    dt.Columns.Add("ZO_RM_Name", GetType(String))
    dt.Columns.Add("ZO_GB_Name", GetType(String))
    dt.Columns.Add("gubeg", GetType(DateTime))
    dt.Columns.Add("guend", GetType(DateTime))

    Dim dr As DataRow = Nothing

    For i As Integer = 0 To 10 Step 1
        dr = dt.NewRow()
        dr("oeId") = "Organization Unit id " + (i * 1000).ToString()
        dr("ZO_RM_Name") = "Room " + i.ToString()
        dr("ZO_GB_Name") = "Building " + i.ToString()
        dr("gubeg") = System.DateTime.Now
        dr("guend") = System.DateTime.Now.AddDays(22).AddYears(20).AddHours(2)
        dt.Rows.Add(dr)
    Next

    For Each drThisRow As DataRow In dt.Rows
        sb.AppendLine("Organisationseinheit " + drThisRow("oeId").ToString() + _
                               +" in Raum " + drThisRow("ZO_RM_Name").ToString() + " von Gebäude " + drThisRow("ZO_GB_Name").ToString() _
                               + " in der Gültigkeit von " + drThisRow("gubeg").ToString() + " bis " + drThisRow("guend").ToString() + "." _
        )
    Next
End Sub '' Main ''
 Dim newstring As String = "SomeString" + "someotherstring" + +"yet another string"