2017-01-23 221 views
3

您好我寫從遺留VB代碼C#代碼的返回類型,我有一個函數:異常堆棧跟蹤

Public Shared Sub logError(ByVal ex As Exception, ByVal additionalInfo As String) 
    Dim messagestr As String 
    If ex.StackTrace.Length > 0 Then 
     For Each stackTrace As String In ex.StackTrace 
      messagestr &= stackTrace 
     Next 
    End If 

我轉換for循環爲:

foreach (string stackTrace in ex.StackTrace) 
{ 
     messagestr += stackTrace; 
} 

有一個錯誤消息在'foreach'下:「無法將類型'char'轉換爲'string'

這聽起來很奇怪,因爲我從MSDN讀取StackTrace,它返回一個字符串,所以我不知道爲什麼有一個for循環傳統的VB代碼,另外,我不知道'char'來自哪裏。

我覺得我完全迷失在這方面。有人可以幫我嗎?

回答

1

根據文檔StackTrace獲取調用堆棧上立即幀的字符串表示形式 。

所以,當你迭代一個字符串,實際上將遍歷其字符,這是發生在你的情況。

在VB中它代表一個堆棧跟蹤,它是一個ordered collection of one or more stack frames。所以當通過幀遍歷它 迭代

+0

首先,您爲什麼認爲StackTrace * class *是特定於VB?其次,要獲得該類的實例,必須實例化該類,如「Dim trace As New StackTrace」;訪問Exception類實例的StackTrace *屬性將會得到一個字符串,不管是C#,VB還是其他任何.NET語言。 –

1

堆棧跟蹤是異常的串屬性,因此,如果循環通過其成員使用的foreach,其成員應的字符數據類型(字符)。你可以簡單地轉換爲

If (ex.StackTrace.Length > 0) 
{ 
    messagestr += ex.StackTrace; 
} 
2

ex.StackTrace的返回類型是string。通過遍歷string得到的對象是char而不是另一個string。所以,你foreach循環必須是:

foreach (char stackTrace in ex.StackTrace) 
{ 

} 

或者乾脆堆棧跟蹤添加到您的字符串:

messagestr += ex.StackTrace; 

如果你想獲得所有的函數調用單獨使用此代碼到你的字符串分割成線:

var stackLines = ex.StackTrace.Split('\n') 
+0

可能令人困惑的部分是VB允許你使用不恰當的類型(即'字符串',其中'字符'是正確的),並將其排序 - 無論 - 可能是使用Option Strict Off的原始VB代碼。 –