为什么string.join在VB.Net中返回列表对象

时间:2012-02-27 15:40:12

标签: vb.net string list

我无法理解这两个命令之间的区别,在我看来应该做同样的事情。如果有任何不清楚的地方,我已经发布了以下全部代码。

我在Person类中创建了两个函数,一个返回包含名字,中间名和姓的列表,另一个返回名称的串联字符串。我引用返回列表的函数将字符串与下面的行连接:

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

然而,当我打电话时:

Console.WriteLine(Person1.Print_Name())

我得到的是list对象而不是字符串:

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 个答案:

答案 0 :(得分:4)

GetNameList返回一个Object(因为您没有指定返回类型)。

所以Join方法正在获取一个对象。因此VB.Net正在将Object转换为String(),其中一个元素是Object.ToString()。有时这个方法,特别是如果它是旧学校VB保持,将检查传递的对象是否是IEnumerable并且只是迭代传递对象中的对象。但不总是。因此,严格和显式关闭会导致非常奇怪且难以发现错误。这两件事情应该只在非常特殊的情况下关闭,你希望所有的灵活性将它们关闭给你并且你已经准备好处理导致的奇怪之处。

将Get_NameList的返回类型更改为List(Of String)

然后启用选项Strict ON和Option Explicit On以查看您的其他问题。

答案 1 :(得分:2)

如果你改变这一行:

Public Function Get_NameList()

Public Function Get_NameList() AS List(Of String)

这一行

Public Function Print_Name()

Public Function Print_Name() as string

它会起作用