Почему string.join возвращает объект списка в VB.Net - PullRequest
2 голосов
/ 27 февраля 2012

Мне трудно понять разницу между этими двумя командами, которые, по моему мнению, должны делать то же самое.Я разместил весь код ниже на случай, если что-то непонятно.

Я создал две функции в классе Person, одна из которых возвращает список, содержащий имя, отчество и фамилию, а другая возвращает конкатенированную строку имени.,Я ссылаюсь на функцию, которая возвращает список для конкатенации строки со строкой ниже:

FullName = String.Join(" ", Me.Get_NameList())

Однако, когда я вызываю:

Console.WriteLine(Person1.Print_Name())

, вместо этого я получаю то, что выглядит как объект спискастроки:

System.Collections.Generic.List`1[System.String]

Если я изменю код, чтобы он выглядел следующим образом:

    Public Function Print_Name()
        Dim FullNameList As List(Of String) = Me.Get_NameList()
        Dim FullName As String
        FullName = String.Join(" ", FullNameList)
        Return FullName
    End Function

Консоль напечатает:

John Q Doe

Почему я получаюдругой ответ, сначала присвоив список переменной, а затем присоединившись к ней?Это как-то связано с тем, как список хранится в памяти?

Заранее спасибо за помощь.

Вот полный код:

Imports System
Module Module1
    Sub Main()
        Dim Person1 As New Person("John", "Q", "Doe")
        Console.WriteLine("Get_Name Values")
        Dim g1 As List(Of String) = Person1.Get_NameList()
        Console.WriteLine(String.Join(" ", g1))
        Console.WriteLine("Print_Name Values")
        Console.WriteLine(Person1.Print_Name())
    End Sub
End Module

Class Person
    Private FirstName As String
    Private MiddleName As String
    Private LastName As String
    Public Sub New(ByVal Fn As String, ByVal Mn As String, ByVal Ln As String)
        FirstName = Fn
        MiddleName = Mn
        LastName = Ln
    End Sub
    Public Function Get_NameList()
        Dim NameList As New List(Of String)
        NameList.Add(FirstName)
        NameList.Add(MiddleName)
        NameList.Add(LastName)
        Return NameList
    End Function
    Public Function Print_Name()
        'Dim FullNameList As List(Of String) = Me.Get_NameList()
        Dim FullName As String
        FullName = String.Join(" ", Me.Get_NameList())
        Return FullName
    End Function
End Class

Ответы [ 2 ]

4 голосов
/ 27 февраля 2012

GetNameList возвращает объект (потому что вы не указываете тип возвращаемого значения).

Итак, метод Join получает объект.Таким образом, VB.Net превращает Объект в String () с одним элементом - Object.ToString ().Иногда метод, особенно если это удержание VB старой школы, проверяет, является ли переданный объект IEnumerable, и просто перебирает объекты в переданном объекте.Но не всегда.Таким образом, наличие Strict и Explicit OFF может привести к очень странным и трудным для поиска ошибкам.Эти две вещи должны быть ВЫКЛЮЧЕНЫ только в очень специфических случаях, когда вам нужна вся гибкость, которую дает их отключение И вы готовы справиться с возникающими странностями.

Измените тип возврата Get_NameList на List (OfСтрока)

И включите параметр Строгое ВКЛ и параметр Явное включение, чтобы увидеть другие проблемы.

2 голосов
/ 27 февраля 2012

если вы измените эту строку:

Public Function Get_NameList()

до

Public Function Get_NameList() AS List(Of String)

И эта строка

Public Function Print_Name()

до

Public Function Print_Name() as string

это будет работать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...