2017-01-23 158 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代码。 –