VB.NET Запрос аргумента не может быть преобразован в строку типа

#vb.net

#vb.net

Вопрос:

Я создал новый список string, и когда я пытаюсь что-то добавить туда, он выдает ошибку: аргумент ‘Prompt’ не может быть преобразован в тип ‘string

Мой код:

 Dim variables As New List(Of String)
Try
            variables.Append(CStr(TextBox1.Text))
            variables.Append(CStr(TextBox2.Text))
            MsgBox(variables)
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
 

Как я могу это исправить?

Комментарии:

1. Какой смысл преобразовывать a String в a String ? Используется CStr для преобразования или приведения чего-либо к типу или как String . Text Свойство элемента управления уже имеет тип String , так чего же вы добиваетесь?

Ответ №1:

Ошибка возникает из-за вашего использования MsgBox() . Вы передаете ему variables переменную, и он не знает, как преобразовать a List(Of String) в a String .

Как указано jmcilhinney, вы должны использовать Add() вместо Append() .

Кроме того, вы должны использовать MessageBox.Show() вместо MsgBox() .

Что касается ошибки, мы можем только предположить, что вы хотите увидеть все текущие значения в вашем списке? Если это так, одним из решений является использование String.Join() и отображение этого вместо:

 Dim variables As New List(Of String)
variables.Add(TextBox1.Text)
variables.Add(TextBox2.Text)
MessageBox.Show(String.Join(",", variables))
 

Но ваш variables список должен быть объявлен на уровне формы, чтобы вы не создавали каждый раз новый. Из вашего сообщения неясно, так это или нет.

Ответ №2:

Вы должны вызывать метод Add экземпляра вашего List(Of String) . Append является методом расширения и не подходит в этом сценарии. Append будет использоваться для перечислимого списка, который вы хотели бы перечислить на месте, например

 Dim names = {"Peter", "Paul", "Mary"}
Dim pNames = names.Where(Function(name) name.StartsWith("P"))

For Each pName In pNames.Append("Philip")
    Console.WriteLine(pName)
Next
 

В этом случае Append влияет только на список, перечисляемый циклом, в котором он используется. Исходный список не изменяется.

Комментарии:

1. Если это не сработало, значит, вы сделали это неправильно. Если вы не покажете нам, что вы сделали, мы не сможем сказать вам, что в этом не так.

2. @jmcihinney я пытаюсь создать способ создания динамически переменных

3. На самом деле не имеет значения, какова ваша мотивация. Вы спросили, как сделать что-то конкретное, и я рассказал вам, как это сделать. Если вы сделаете то, что я сказал, тогда ваш код будет работать, по крайней мере, до добавления указанных элементов в этот список. Если у вас есть другой вопрос, возможно, вам следует опубликовать этот вопрос вместо того, чтобы помечать его в комментарии к ответу.

Ответ №3:

Вы должны использовать Add метод:

 Dim variables As List(Of String) = New List(Of String)
variables.Add(TextBox1.Text)
 

(Нет необходимости в избыточном CStr , поскольку TextBox1.Text он уже имеет тип String .)

Как, несомненно, предложит @Mary — правильно! — всегда иметь Option Explicit и Option Strict устанавливать значение On (и, на мой взгляд, Option Infer Off); это поможет вам с любыми проблемами синтаксиса.

И всегда обращайте внимание на предложения синтаксиса / компилятора на левом поле, которые дадут вам подсказки / подсказки для исправления или улучшения вашего кода.

Наконец, обратитесь к документации Microsoft, если сомневаетесь. Это должен быть ваш первый порт вызова, если вы ни в чем не уверены.

Ответ №4:

Как упоминали несколько человек, используйте .Добавить метод нет .Добавить.

The .Свойство Text текстового поля уже является строкой. Нет необходимости преобразовывать с помощью CStr().

В окне сообщения отображается строка. переменные — это не строка; это список (строки). Чтобы увидеть, что находится в вашем списке, используйте для каждого цикла.

 Private Sub OpCode()
    Dim variables As New List(Of String)
    variables.Add(TextBox1.Text)
    variables.Add(TextBox2.Text)
    For Each s In variables
        MsgBox(s)
    Next
End Sub
 

@SteveCinq правильно :-); включите параметр Strict .