Конкатенация строк VB.NET: ошибка компилятора? - PullRequest
1 голос
/ 09 ноября 2011

Вопрос:

Приведенная ниже программа выдает ошибку времени выполнения (недопустимое преобразование из double), потому что после

 + _

следует символ новой строки и

 +"

Другими словами, это

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

<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"

Компилируется нормально, но когда программазапускается, выдает ошибку во время выполнения.Это ошибка компилятора?Разве это не остановит меня из-за ошибки компилятора, такой как неверный синтаксис?

Ответы [ 2 ]

4 голосов
/ 09 ноября 2011

Оператор + поставляется в двух вариантах:

  • бинарный оператор, a + b
  • унарный оператор, +a

первый говорит: «возьми a и добавь b и получи результаты».Второй говорит «возьми a с положительным знаком».

В этом случае выражение оценивается как строка + двойное число, потому что VB.NET с OPTION STRICT OFF будет думать, что ты хочешьвторой операнд здесь как строка, которая будет автоматически преобразована в double во время выполнения, потому что вы добавили префикс с помощью унарного оператора +.

Установите OPTION STRICT ON, чтобы сделать VB.NET более строгим с егопроверка типов во время компиляции, за счет того, что в некоторых случаях вам приходится писать код немного более конкретно.

2 голосов
/ 09 ноября 2011

Попробуйте использовать & в качестве оператора конкатенации в vb.net, это приведет к ошибке компиляции без включения Option Strict. Я думаю, что происходит из-за отсутствия контента между операторами, он использует второй + в качестве знака для числа (например, +1). Из-за неявного преобразования VB по умолчанию он пытается преобразовать строковый литерал в число.

Использование Option Strict On приведет к отображению ошибки компилятора.

...