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

为什么VB.Net中的string.join返回列表对象,vb.net,string,list,Vb.net,String,List,我很难理解这两个命令之间的区别,这两个命令在我的头脑中应该做同样的事情。我已经发布了下面的全部代码,以防有任何不清楚的地方 我在Person类中创建了两个函数,一个返回包含名字、中间名和姓氏的列表,另一个返回名称的串联字符串。我引用返回列表的函数,将字符串与下面的行连接起来: FullName = String.Join(" ", Me.Get_NameList()) 然而,当我打电话时: Console.WriteLine(Person1.Print_Name()) 我得到的是列表对象而不

我很难理解这两个命令之间的区别,这两个命令在我的头脑中应该做同样的事情。我已经发布了下面的全部代码,以防有任何不清楚的地方

我在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

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

因此,Join方法正在获取一个对象。因此,VB.Net将对象转换为字符串(),其中一个元素是Object.ToString()。有时,该方法,特别是如果它是一个老式的VB保留,会检查传递的对象是否是IEnumerable,并只是迭代传递的对象中的对象。但并非总是如此。因此,严格和明确的关闭可能会导致非常奇怪和难以找到的错误。只有在非常特殊的情况下才应该关闭这两个功能,在这种情况下,您需要关闭它们所提供的所有灵活性,并且您已经准备好处理由此产生的奇怪现象

将Get_NameList的返回类型更改为List(字符串的)


并打开option Strict on和option Explicit on以查看其他问题。

如果更改此行:

Public Function Get_NameList()

这条线呢

Public Function Print_Name()


它将起作用

fyi-通常认为没有明确返回类型的函数是不好的做法。是否怀疑函数上的设置返回类型将修复问题,或者至少强制编译器错误,使问题更加明显。哦,您可以选择“推断”选项或“显式”选项,对吗?打开“严格选项”。不使用它可能会导致找不到问题。只是一个旁注,但最好是在Print_Name中返回一个连接的字符串,而不是获取一个列表然后加入它。或者使用
String.Format
@Joel:为什么。。。或最好的选择是将option Explicit和option Inferre设置为on。感谢您提供的信息!我甚至不知道显式、严格或推断选项。我一直在教自己如何编程,有时一些真正基本的东西会崩溃!我没有为代码定义任何选项,所以我使用默认选项。我想我没有注意到,因为VisualStudioIDE为您做了一些基本的类型检查。哦,@musefan,我希望将来的代码能够灵活地返回一个列表或字符串,所以这节省了我一点打字时间。如果这是一个糟糕的做法,请告诉我。是的,@Geoff,也更改后一种方法的名称
Print\u Name
听起来像是
Sub
的名字。该方法实际上不打印任何内容。将其更改为
GetPrintName
或类似内容。是的,它应该是GetPrintName。所以当我将
FullNameList定义为list(of string)
时,我真是幸运。此时返回的对象被转换为一个列表,然后我就可以连接它了。因为我最初没有声明函数的返回类型,所以我尝试加入尚未转换的对象,这就是为什么我要得到该对象。
Public Function Print_Name()
Public Function Print_Name() as string