2012-02-27 97 views
2

我無法理解這兩個命令之間的區別,在我看來應該做同樣的事情。如果有任何不清楚的地方,我已經發布了下面的整個代碼。爲什麼在VB.Net中string.join返回列表對象

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

fyi - 它通常被認爲是不好的做法,有沒有顯式返回類型的函數。可疑的設置函數的返回類型將解決您的問題,或者至少強制編譯器錯誤,這會使問題更加明顯。哦,而且你有Option Infer或Option Explicit,對不對? – 2012-02-27 15:43:30

+4

開啓'選項嚴格開啓'。保持關閉可能會導致無法找到問題。 – Ryan 2012-02-27 15:45:36

+0

只是一個方面的說明,但你會更好,只是在Print_Name中返回一個串聯的字符串,而不是獲得一個列表,然後加入它。或者使用'String.Format' – musefan 2012-02-27 15:53:23

回答

4

GetNameList返回一個對象(因爲你不指定返回類型)。

所以Join方法獲取一個對象。所以VB.Net使用Object.ToString()中的一個元素將Object轉換爲String()。有時候,這種方法,特別是如果它是一個老派VB擱置,會檢查傳遞的對象是否是IEnumerable,並且只是遍歷傳入對象中的對象。但不總是。因此,嚴格和明確關閉可能導致非常奇怪和難以發現的錯誤。這兩件事情應該只在非常特殊的情況下關閉,您希望所有的靈活性關閉給你,並且你準備好處理所導致的怪異情況。

變化Get_NameList的返回類型列表(串)

,並打開選項嚴格ON和顯式的選項,看看你的其他問題。

+0

。所以當我將'FullNameList定義爲列表(字符串)'時,我感到很幸運。返回的對象在那時轉換爲列表,然後我可以連接它。由於我原來並未聲明函數的返回類型,因此我試圖加入尚未轉換的對象,這就是我獲取對象的原因。 – 2012-02-27 18:56:22

2

,如果你改變這一行:

Public Function Get_NameList() 

Public Function Get_NameList() AS List(Of String) 

而此行

Public Function Print_Name() 

Public Function Print_Name() as string 

它會工作

+0

是的,@Geoff,也改變後一種方法的名字。 'Print_Name'聽起來像是一個'Sub'的名字。該方法實際上不打印任何東西。將其更改爲'GetPrintName'或類似的。 – 2012-02-27 16:02:06

+0

是的,它應該是GetPrintName – Arion 2012-02-27 16:18:08

相關問題