2017-01-23 4 views
3

Hallo Ich schreibe C# Codes von Legacy-VB Codes, ich habe eine Funktion:Rückgabetyp von Exception Stacktrace

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 

umgewandelt I die for-Schleife wie:

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

Es gibt eine Fehlermeldung unter 'foreach': "Kann den Typ 'char' nicht in 'string' konvertieren.

Es ist ziemlich merkwürdig, da ich den StackTrace von MSDN gelesen habe, dass er einen String zurückgibt. Also weiß ich nicht, warum es eine for-Schleife gibt die alten VB-Codes, und ich auch nicht woher kommt der "char"?

Ich denke, ich bin komplett in diesem Bereich verloren. Kann mir jemand helfen?

Antwort

1

Nach der Dokumentation StackTrace Ruft eine String-Darstellung des unmittelbaren Frames in dem Call-Stack.

Wenn Sie also eine Zeichenfolge durchlaufen, die tatsächlich durch ihre Zeichen iterieren wird, geschieht dies in Ihrem Fall.

Wo in VB es steht eine Stack-Trace, die eine ordered collection of one or more stack frames ist. so dass, wenn man es iteriert durch die Rahmen

+0

Erstens, warum denken Sie, StackTrace * Klasse * ist spezifisch für VB? Zweitens, um eine Instanz dieser * Klasse * zu erhalten, muss man diese Klasse buchstäblich instanziieren, wie zum Beispiel "Dim trace As New StackTrace"; Wenn Sie auf die StackTrace * -Eigenschaft * einer Exception-Klasseninstanz zugreifen, erhalten Sie einen String, sei es C#, VB oder eine andere .NET-Sprache. –

1

Stacktrace ist der String-Eigenschaft Exception iterieren, so dass, wenn man eine Schleife durch seine Mitglieds foreach verwenden, dessen Mitglied sollte Zeichendatentyp (char) sein. Sie könnten einfach konvertieren

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

Der Rückgabetyp ex.StackTrace ein string ist. Das Objekt, das Sie erhalten, wenn Sie über eine string iterieren, ist char nicht eine andere string. So müssen Sie foreach Schleife:

foreach (char stackTrace in ex.StackTrace) 
{ 

} 

Oder einfach Stack-Trace auf Ihre Zeichenfolge anhängen:

messagestr += ex.StackTrace; 

Wenn Sie alle Funktionen erhalten möchten separat Anrufe diesen Code verwenden, um Ihre Zeichenfolge in Zeilen aufgeteilt:

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

Der Teil, der verwirrend sein kann, ist, dass VB Ihnen erlaubt, unpassende Typen zu verwenden (d. H. "String", wo "Char" korrekt ist) und es trotzdem aussortiert - vielleicht den ursprünglichen VB-Code, der Option Strict Off verwendet. –

Verwandte Themen