Giter VIP home page Giter VIP logo

icsharpcode / codeconverter Goto Github PK

View Code? Open in Web Editor NEW
804.0 38.0 207.0 13.92 MB

Convert code from C# to VB.NET and vice versa using Roslyn

Home Page: https://icsharpcode.github.io/CodeConverter/

License: MIT License

C# 89.22% CSS 0.12% HTML 0.10% PowerShell 0.18% Visual Basic .NET 9.46% Batchfile 0.01% Shell 0.02% TypeScript 0.79% JavaScript 0.12%
online-snippet-converter code-converter c-sharp vb-net visual-studio roslyn converter

codeconverter's Introduction

Code Converter

Build CodeConverter Install

Convert code from VB.NET to C# (and vice versa) using Roslyn - all free and open source:

  • Visual Studio extension
    • To install close VS and double-click the downloadeded .vsix file
  • Online snippet converter
  • Command line dotnet tool install ICSharpCode.CodeConverter.codeconv --global (still requires VS2022 17.1+ installed)
  • Nuget library (this underpins all other free converters you'll find online)

See wiki for advice on getting the best results, or the changelog for recent improvements.

Visual Studio Extension

Adds context menu items to convert projects/files between VB.NET and C#. See the wiki documentation for advice / help using it.

Download from Visual Studio Marketplace (Use VS 2022 17.1+)

  • Flexible: Convert a small selection, or a whole solution in one go, in either direction.
  • Accurate: Full project context (through Roslyn) is used to get the most accurate conversion.
  • Safe: Conversion runs entirely locally - your code doesn't leave your machine.
  • Completely free and open source GitHub project.
  • Integrated: Uses the Output window to show conversion progress / summary.
  • Actively developed: User feedback helps us continuously strive for a more accurate conversion.

Selected text conversion context menu

Contributing

Let us know what needs improving. If you want to get involved in writing the code yourself, even better! We've already had code contributions from several first time GitHub contributors, so don't be shy! See Contributing.md for more info.

The VB -> C# conversion quality is much higher than the C# -> VB conversion quality. The use cases differ considerably as does the supply/demand of improvements.

Use cases

Visual Basic .NET is slowly dying. It has support for some project types on .NET 5, but won't be getting new features according to the .NET Team Blog. Hence the main use case for:

  • VB->C#: moving whole projects
  • C#->VB: help incorporate snippets from stack overflow into existing VB codebase, or to help learning one language from the other

Other ways to use the converter

Building/running from source

  1. Ensure you have .NET Core SDK 6.0
  2. Open the solution in Visual Studio 2022+ (Community edition is sufficient)
  3. To run the website, set CodeConverter.Web as the startup project
  • You will need Node (LTS) 16.* (node 17 introduces a breaking change causing ERR_OSSL_EVP_UNSUPPORTED)
  1. To run the Visual Studio extension, set Vsix as the startup project
    • A new instance of Visual Studio will open with the extension installed

History

A spiritual successor of the code conversion within SharpDevelop and later part of Refactoring Essentials, the code converter was separated out to avoid difficulties with different Visual Studio and Roslyn versions.

More screenshots

codeconverter's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

codeconverter's Issues

TestNarrowingWideningConversionOperator is in the wrong file

The test TestNarrowingWideningConversionOperator is in the MemberTests.cs file in the VB directory, but it is the only test in the file that goes from VB to CSharp. It appears it needs moved to the MemberTests.cs file in the CSharp directory.

VB -> C#: Ommitting ParamsArray when calling extension method errors

Input:

Imports Owin
Imports HostingMiddleware

Partial Public Class Startup
    Public Sub Configuration(app As IAppBuilder)
        app.Use(Of AssetPathRewritingMiddleware)
        app.Use(Of AssetPathCheckingMiddleware)
    End Sub
End Class

Error:

    System.NullReferenceException: Object reference not set to an instance of an object.
       at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.VisitInvocationExpression(InvocationExpressionSyntax node)
       at Microsoft.CodeAnalysis.VisualBasic.Syntax.InvocationExpressionSyntax.Accept[TResult](VisualBasicSyntaxVisitor`1 visitor)
       at Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxVisitor`1.Visit(SyntaxNode node)
       at ICSharpCode.CodeConverter.CSharp.CommentConvertingNodesVisitor.DefaultVisit(SyntaxNode node)
       at Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxVisitor`1.VisitInvocationExpression(InvocationExpressionSyntax node)
       at Microsoft.CodeAnalysis.VisualBasic.Syntax.InvocationExpressionSyntax.Accept[TResult](VisualBasicSyntaxVisitor`1 visitor)
       at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.MethodBodyVisitor.VisitExpressionStatement(ExpressionStatementSyntax node)
       at Microsoft.CodeAnalysis.VisualBasic.Syntax.ExpressionStatementSyntax.Accept[TResult](VisualBasicSyntaxVisitor`1 visitor)
       at Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxVisitor`1.Visit(SyntaxNode node)
       at ICSharpCode.CodeConverter.CSharp.CommentConvertingMethodBodyVisitor.DefaultVisit(SyntaxNode node)
       at Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxVisitor`1.VisitExpressionStatement(ExpressionStatementSyntax node)
       at Microsoft.CodeAnalysis.VisualBasic.Syntax.ExpressionStatementSyntax.Accept[TResult](VisualBasicSyntaxVisitor`1 visitor)
       at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.<>c__DisplayClass33_0.<VisitStatements>b__0(StatementSyntax s)
       at System.Linq.Enumerable.<SelectManyIterator>d__17`2.MoveNext()
       at Microsoft.CodeAnalysis.SyntaxList`1.CreateNode(IEnumerable`1 nodes)
       at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.VisitStatements(SyntaxList`1 statements, Boolean isIterator)
       at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.VisitMethodBlock(MethodBlockSyntax node)
       at Microsoft.CodeAnalysis.VisualBasic.Syntax.MethodBlockSyntax.Accept[TResult](VisualBasicSyntaxVisitor`1 visitor)
       at Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxVisitor`1.Visit(SyntaxNode node)
       at ICSharpCode.CodeConverter.CSharp.CommentConvertingNodesVisitor.DefaultVisit(SyntaxNode node)
       at Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxVisitor`1.VisitMethodBlock(MethodBlockSyntax node)
       at Microsoft.CodeAnalysis.VisualBasic.Syntax.MethodBlockSyntax.Accept[TResult](VisualBasicSyntaxVisitor`1 visitor)
       at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.<ConvertMembers>d__19.MoveNext()
       at Microsoft.CodeAnalysis.SyntaxList`1.CreateNode(IEnumerable`1 nodes)
       at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.VisitClassBlock(ClassBlockSyntax node)
       at Microsoft.CodeAnalysis.VisualBasic.Syntax.ClassBlockSyntax.Accept[TResult](VisualBasicSyntaxVisitor`1 visitor)
       at Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxVisitor`1.Visit(SyntaxNode node)
       at ICSharpCode.CodeConverter.CSharp.CommentConvertingNodesVisitor.WithPortedTrivia[TSource,TDest](SyntaxNode node, Func`3 portExtraTrivia)
       at ICSharpCode.CodeConverter.CSharp.CommentConvertingNodesVisitor.VisitClassBlock(ClassBlockSyntax node)
       at Microsoft.CodeAnalysis.VisualBasic.Syntax.ClassBlockSyntax.Accept[TResult](VisualBasicSyntaxVisitor`1 visitor)
       at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.<VisitCompilationUnit>b__16_3(StatementSyntax m)
       at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
       at Microsoft.CodeAnalysis.SyntaxList`1.CreateNode(IEnumerable`1 nodes)
       at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.VisitCompilationUnit(CompilationUnitSyntax node)
       at Microsoft.CodeAnalysis.VisualBasic.Syntax.CompilationUnitSyntax.Accept[TResult](VisualBasicSyntaxVisitor`1 visitor)
       at Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxVisitor`1.Visit(SyntaxNode node)
       at ICSharpCode.CodeConverter.CSharp.CommentConvertingNodesVisitor.DefaultVisit(SyntaxNode node)
       at ICSharpCode.CodeConverter.CSharp.CommentConvertingNodesVisitor.VisitCompilationUnit(CompilationUnitSyntax node)
       at Microsoft.CodeAnalysis.VisualBasic.Syntax.CompilationUnitSyntax.Accept[TResult](VisualBasicSyntaxVisitor`1 visitor)
       at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.ConvertCompilationTree(VisualBasicCompilation compilation, VisualBasicSyntaxTree tree)
       at ICSharpCode.CodeConverter.CSharp.VBToCSConversion.SingleFirstPass(Compilation sourceCompilation, SyntaxTree tree)
       at ICSharpCode.CodeConverter.Shared.ProjectConversion`1.FirstPass()

C# -> VB: Error converting nameof(Math.Pow)

SyntaxFactory.ParseExpression($"{nameof(Math)}.{nameof(Math.Pow)}")

converts to

SyntaxFactory.ParseExpression($"{NameOf(Math)}.{NameOf(AddressOf Math.Pow)}")

This should fix it.

VisualBasicSyntaxNode WrapTypedNameIfNecessary(ExpressionSyntax name, CSS.ExpressionSyntax originalName)
{
	if (originalName.Parent is CSS.NameSyntax
	    || originalName.Parent is CSS.AttributeSyntax
	    || originalName.Parent is CSS.MemberAccessExpressionSyntax
	    || originalName.Parent is CSS.MemberBindingExpressionSyntax
	    || originalName.Parent is CSS.InvocationExpressionSyntax)
	    return name;

	if (originalName.Parent is CSS.ArgumentSyntax && originalName.Parent.Parent?.Parent is CSS.InvocationExpressionSyntax) {
	    var InvocationExpression = (CSS.InvocationExpressionSyntax)originalName.Parent.Parent.Parent;

	    if (InvocationExpression.Expression.IsKind(CS.SyntaxKind.IdentifierName)) {
		var Identifier = (CSS.IdentifierNameSyntax)InvocationExpression.Expression;

		if (Identifier.ToFullString() == "nameof") {
		    return name;
		}
	    }
	}

	var symbolInfo = semanticModel.GetSymbolInfo(originalName);
	var symbol = symbolInfo.Symbol ?? symbolInfo.CandidateSymbols.FirstOrDefault();
	if (symbol.IsKind(SymbolKind.Method))
	    return SyntaxFactory.AddressOfExpression(name);


	return name;
}

VB -> C# name qualification

Partial qualifications such as IO.Path need to be fully qualified to System.IO.Path or have a using statement added and be shortened to Path

WIP here: GrahamTheCoder#3

VS2017 - Can't resolve dependencies

If I debug the vsix project on commit dd123bf
when I attempt a conversion I receive the error below.
The dependencies haven't been copied to the extension folder (I believe because things with the MS public key token get excluded from being copied).

I tried a few fixes but for now I could only get this big hammer solution to work for me: c37e211

---------------------------
Microsoft Visual Studio
---------------------------
Convert VB to C#:

An error has occured during conversion: System.IO.FileNotFoundException: Could not load file or assembly 'Microsoft.CodeAnalysis, Version=2.6.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified.

File name: 'Microsoft.CodeAnalysis, Version=2.6.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'

   at ICSharpCode.CodeConverter.CodeWithOptions..ctor(String text)

   at RefactoringEssentials.VsExtension.CodeConversion.TryConvertingVBToCSCode(String inputCode) in C:\Users\Graham\Documents\GitHub\CodeConverter\Vsix\CodeConversion.cs:line 103

   at RefactoringEssentials.VsExtension.CodeConversion.PerformVBToCSConversion(IServiceProvider serviceProvider, String inputCode) in C:\Users\Graham\Documents\GitHub\CodeConverter\Vsix\CodeConversion.cs:line 67



=== Pre-bind state information ===

LOG: DisplayName = Microsoft.CodeAnalysis, Version=2.6.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
 (Fully-specified)

LOG: Appbase = file:///C:/Program Files (x86)/Microsoft Visual Studio/2017/Professional/Common7/IDE/

LOG: Initial PrivatePath = NULL

Calling assembly : ICSharpCode.CodeConverter, Version=5.5.0.0, Culture=neutral, PublicKeyToken=null.

===

LOG: This bind starts in LoadFrom load context.

WRN: Native image will not be probed in LoadFrom context. Native image will only be probed in default load context, like with Assembly.Load().

LOG: Using application configuration file: C:\Users\Graham\AppData\Local\Microsoft\VisualStudio\15.0_65d9c480Roslyn\devenv.exe.config

LOG: Using host configuration file: 

LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config.

LOG: Post-policy reference: Microsoft.CodeAnalysis, Version=2.6.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35

LOG: The same bind was seen before, and was failed with hr = 0x80070002.


---------------------------
OK   
---------------------------

Add support to With Block Syntax in VB.NET for conversion in C#

Code with With Syntax in VB.NET throw a Not Implemented exception:

image

Code example:

    Private Shared Function GetTraceData(except As Exception) As String
        Dim messageTrace As New StringBuilder
        Dim trace As New StackTrace(except, True)
        If trace.FrameCount > 0 Then
            With trace.GetFrame(0)
                messageTrace.AppendFormat("File name: {0}", .GetFileName)
                messageTrace.AppendFormat("{0}Line: {1}", Environment.NewLine, .GetFileLineNumber)
                messageTrace.AppendFormat("{0}Column: {1}{0}{0}", Environment.NewLine, .GetFileColumnNumber)
            End With
        End If
        Return messageTrace.ToString
    End Function

Make converter work for sub-method snippets

Example code that should work

     If pType = "Dimension" Then
           Me.UsesDimensions = True
           Exit Sub
       End If

Expected output:

        if (pType == "Dimension")
        {
            this.UsesDimensions = true;
            return;
        }

Current behaviour: Throws

Error message:
----- Exception 1 of 1 -----
System.NotImplementedException: Microsoft.CodeAnalysis.VisualBasic.Syntax.IfStatementSyntax not implemented!
   at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.DefaultVisit(SyntaxNode node) in D:\GitWorkspace\CodeConverter\ICSharpCode.CodeConverter\CSharp\NodesVisitor.cs:line 64
   at Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxVisitor`1.VisitIfStatement(IfStatementSyntax node)
   at Microsoft.CodeAnalysis.VisualBasic.Syntax.IfStatementSyntax.Accept[TResult](VisualBasicSyntaxVisitor`1 visitor)
   at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.<VisitCompilationUnit>b__12_1(StatementSyntax m) in D:\GitWorkspace\CodeConverter\ICSharpCode.CodeConverter\CSharp\NodesVisitor.cs:line 97
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   at Microsoft.CodeAnalysis.SyntaxList`1.CreateNode(IEnumerable`1 nodes)
   at Microsoft.CodeAnalysis.SyntaxList`1..ctor(IEnumerable`1 nodes)
   at Microsoft.CodeAnalysis.CSharp.SyntaxFactory.List[TNode](IEnumerable`1 nodes)
   at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.VisitCompilationUnit(CompilationUnitSyntax node) in D:\GitWorkspace\CodeConverter\ICSharpCode.CodeConverter\CSharp\NodesVisitor.cs:line 97
   at Microsoft.CodeAnalysis.VisualBasic.Syntax.CompilationUnitSyntax.Accept[TResult](VisualBasicSyntaxVisitor`1 visitor)
   at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.Convert(VisualBasicSyntaxNode input, SemanticModel semanticModel, Document targetDocument) in D:\GitWorkspace\CodeConverter\ICSharpCode.CodeConverter\CSharp\VisualBasicConverter.cs:line 39
   at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.ConvertText(String text, MetadataReference[] references) in D:\GitWorkspace\CodeConverter\ICSharpCode.CodeConverter\CSharp\VisualBasicConverter.cs:line 51

Example solution:
It works if you surround that code in a method and class, so we could just delegate the default visit of NodesVisitor to MethodBodyVisitor

VB -> C#: Comment lines lost

It would be helpful if the comments were not stripped out of the converted code. When things don't work and one is trying to compare the before and after, the comments would be especially helpful.

Thanks!

Support Erase and Redim Preserve

  • Erase Erase arrayVar -> arrayVar = null
  • Redim Preserve case Array.Copy(arySrc, aryDest, Math.Min(arySrc.Length, aryDest.Length));

C# -> VB: Simple if statement with else clause

A simple if statement in C# converts to a single line if statement in VB. If there is an else clause the converted else single line else clause ends up on the next line.

public override SyntaxList<StatementSyntax> VisitReturnStatement(CSS.ReturnStatementSyntax node)
{
	StatementSyntax stmt;
	if (node.Expression == null)
	    stmt = SyntaxFactory.ReturnStatement();
	else
	    stmt = SyntaxFactory.ReturnStatement((ExpressionSyntax)node.Expression.Accept(nodesVisitor));
	return SyntaxFactory.SingletonList(stmt);
}

becomes

Public Overrides Function VisitReturnStatement(ByVal node As CSS.ReturnStatementSyntax) As SyntaxList(Of StatementSyntax)
    Dim stmt As StatementSyntax
    If node.Expression Is Nothing Then stmt = SyntaxFactory.ReturnStatement()
    Else stmt = SyntaxFactory.ReturnStatement(CType(node.Expression.Accept(nodesVisitor), ExpressionSyntax))
    Return SyntaxFactory.SingletonList(stmt)
End Function

Improve support for sub-class snippets through the website

Converting just a method will appear to work, but in fact it's missing all symbol information and hence will make lots of wrong guesses about the conversion.

Currently there's a hack which catches total conversion failures and tries again with a method/class surrounding the code. The proper solution is to detect up front when we have a partial snippet, and surround it in a method and/or class as appropriate.

See example of code that doesn't work without context at #18

AnonymousObject - NotImplementedException

I have just been converting my LINQ queries and I've come across a not implemented exception, it seems it doesn't like anonymous objects.

Here's an example that throws the exception:

Dim obj = New With
{
    .Name = "Hello",
    .Value = "World"
}

Expected:

var obj = new
{
    Name = "Hello",
    Value = "World"
}

Here is the stacktrace I get:

Error message:
----- Exception 1 of 1 -----
System.NotImplementedException: Microsoft.CodeAnalysis.VisualBasic.Syntax.AnonymousObjectCreationExpressionSyntax not implemented!
   at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.DefaultVisit(SyntaxNode node)
   at Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxVisitor`1.VisitAnonymousObjectCreationExpression(AnonymousObjectCreationExpressionSyntax node)
   at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.VisitAnonymousObjectCreationExpression(AnonymousObjectCreationExpressionSyntax node)
   at Microsoft.CodeAnalysis.VisualBasic.Syntax.AnonymousObjectCreationExpressionSyntax.Accept[TResult](VisualBasicSyntaxVisitor`1 visitor)
   at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.VisitSingleLineLambdaExpression(SingleLineLambdaExpressionSyntax node)
   at Microsoft.CodeAnalysis.VisualBasic.Syntax.SingleLineLambdaExpressionSyntax.Accept[TResult](VisualBasicSyntaxVisitor`1 visitor)
   at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.VisitSimpleArgument(SimpleArgumentSyntax node)
   at Microsoft.CodeAnalysis.VisualBasic.Syntax.SimpleArgumentSyntax.Accept[TResult](VisualBasicSyntaxVisitor`1 visitor)
   at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.<VisitArgumentList>b__56_0(ArgumentSyntax a)
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   at Microsoft.CodeAnalysis.CSharp.SyntaxFactory.SeparatedList[TNode](IEnumerable`1 nodes)
   at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.VisitArgumentList(ArgumentListSyntax node)
   at Microsoft.CodeAnalysis.VisualBasic.Syntax.ArgumentListSyntax.Accept[TResult](VisualBasicSyntaxVisitor`1 visitor)
   at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.VisitInvocationExpression(InvocationExpressionSyntax node)
   at Microsoft.CodeAnalysis.VisualBasic.Syntax.InvocationExpressionSyntax.Accept[TResult](VisualBasicSyntaxVisitor`1 visitor)
   at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.VisitMemberAccessExpression(MemberAccessExpressionSyntax node)
   at Microsoft.CodeAnalysis.VisualBasic.Syntax.MemberAccessExpressionSyntax.Accept[TResult](VisualBasicSyntaxVisitor`1 visitor)
   at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.VisitInvocationExpression(InvocationExpressionSyntax node)
   at Microsoft.CodeAnalysis.VisualBasic.Syntax.InvocationExpressionSyntax.Accept[TResult](VisualBasicSyntaxVisitor`1 visitor)
   at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.VisitMemberAccessExpression(MemberAccessExpressionSyntax node)
   at Microsoft.CodeAnalysis.VisualBasic.Syntax.MemberAccessExpressionSyntax.Accept[TResult](VisualBasicSyntaxVisitor`1 visitor)
   at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.VisitInvocationExpression(InvocationExpressionSyntax node)
   at Microsoft.CodeAnalysis.VisualBasic.Syntax.InvocationExpressionSyntax.Accept[TResult](VisualBasicSyntaxVisitor`1 visitor)
   at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.VisitMemberAccessExpression(MemberAccessExpressionSyntax node)
   at Microsoft.CodeAnalysis.VisualBasic.Syntax.MemberAccessExpressionSyntax.Accept[TResult](VisualBasicSyntaxVisitor`1 visitor)
   at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.VisitInvocationExpression(InvocationExpressionSyntax node)
   at Microsoft.CodeAnalysis.VisualBasic.Syntax.InvocationExpressionSyntax.Accept[TResult](VisualBasicSyntaxVisitor`1 visitor)
   at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.SplitVariableDeclarations(VariableDeclaratorSyntax declarator, NodesVisitor nodesVisitor, SemanticModel semanticModel)
   at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.MethodBodyVisitor.VisitLocalDeclarationStatement(LocalDeclarationStatementSyntax node)
   at Microsoft.CodeAnalysis.VisualBasic.Syntax.LocalDeclarationStatementSyntax.Accept[TResult](VisualBasicSyntaxVisitor`1 visitor)
   at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.<>c__DisplayClass28_0.<VisitMethodBlock>b__1(StatementSyntax s)
   at System.Linq.Enumerable.<SelectManyIterator>d__17`2.MoveNext()
   at Microsoft.CodeAnalysis.SyntaxList`1.CreateNode(IEnumerable`1 nodes)
   at Microsoft.CodeAnalysis.CSharp.SyntaxFactory.Block(IEnumerable`1 statements)
   at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.VisitMethodBlock(MethodBlockSyntax node)
   at Microsoft.CodeAnalysis.VisualBasic.Syntax.MethodBlockSyntax.Accept[TResult](VisualBasicSyntaxVisitor`1 visitor)
   at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.<ConvertMembers>b__15_0(StatementSyntax m)
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.<ConvertMembers>d__15.MoveNext()
   at Microsoft.CodeAnalysis.SyntaxList`1.CreateNode(IEnumerable`1 nodes)
   at Microsoft.CodeAnalysis.SyntaxList`1..ctor(IEnumerable`1 nodes)
   at Microsoft.CodeAnalysis.CSharp.SyntaxFactory.List[TNode](IEnumerable`1 nodes)
   at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.VisitClassBlock(ClassBlockSyntax node)
   at Microsoft.CodeAnalysis.VisualBasic.Syntax.ClassBlockSyntax.Accept[TResult](VisualBasicSyntaxVisitor`1 visitor)
   at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.<VisitCompilationUnit>b__12_1(StatementSyntax m)
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   at Microsoft.CodeAnalysis.SyntaxList`1.CreateNode(IEnumerable`1 nodes)
   at Microsoft.CodeAnalysis.SyntaxList`1..ctor(IEnumerable`1 nodes)
   at Microsoft.CodeAnalysis.CSharp.SyntaxFactory.List[TNode](IEnumerable`1 nodes)
   at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.VisitCompilationUnit(CompilationUnitSyntax node)
   at Microsoft.CodeAnalysis.VisualBasic.Syntax.CompilationUnitSyntax.Accept[TResult](VisualBasicSyntaxVisitor`1 visitor)
   at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.Convert(VisualBasicSyntaxNode input, SemanticModel semanticModel, Document targetDocument)
   at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.ConvertText(String text, MetadataReference[] references)

C# -> VB: For loop variable is not declared and initialized

using System;

namespace myApp
{
    class Program
    {
        static void Main()
        {
            int total = 0;                        
            for (int i = 0; i < 5; ++i) 
            { 
                total = i + total;
            } 
            Console.WriteLine(total);
        }
    }
}

becomes

Imports System

Namespace myApp
    Class Program
        Private Shared Sub Main()
            Dim total As Integer = 0

            While i < 5
                total = i + total
                System.Threading.Interlocked.Increment(i)
            End While

            Console.WriteLine(total)
        End Sub
    End Class
End Namespace

First off, I'm not sure why the for is getting translated into a while (UPDATE: It's due to ++i instead of i++). But even if while was correct, i is never instantiated in the VB.NET code.

Always use project context for conversion

Currently the VSIX creates its own compilation unit containing just the converted text.
Instead, I propose to pass through Visual Studio's compilation unit for the project.

This will lead to much better conversion since types can be resolved.

  • VB -> C# #28
  • C# -> VB

Best effort conversion with NotImplemented/NotSupported errors as comments inline

Currently if there's a single piece of syntax causing an error in a thousand line file, you'll get no output except the error message.

The proposal is to put those errors as a comment inline prefixed with something like "TODO: Conversion error" so it's easy to search for them. The output window would also still list all errors.

This would provide a better user experience, and make it easier to track down which bit of syntax is unsupported without requiring the whole input file for a bug report.

  • Turn DefaultVisit's error case into a comment (to some extent blocked by #48)
    • Still list the errors in the output window, either by annotating the node with the error, and checking at the end, or by passing in a logger interface, and directly outputting to there at the time (probably preferred for responsiveness).
  • Add the ToString of the failing node to the comment so the code can be manually converted
  • Add a best effort conversion for any child elements
  • Consider doing this for all exceptions thrown (not just NotImplemented/NotSupported)
    • The Comment Converting visitors would be well placed to contain a try catch block for this since most calls go through them very soon after an error could occur
    • Some thought will have to be given to avoiding getting stuck in a loop

The challenge is to find a single point to implement this behaviour in the NodesVisitor, but in a way that doesn't involve returning a node of the wrong type - otherwise the parent node won't be properly constructed. The idea is to keep as much correct conversion as possible. This might mean discarding back to the declaration level, and returning a whitespace node with a comment suffix.

C# -> VB: Support declaration expressions

Error processing Vsix\VisualStudioInteraction.cs
In 'C:\Users\Graham\Documents\GitHub\CodeConverter\Vsix\VisualStudioInteraction.cs':
System.NotImplementedException: Cannot convert DeclarationExpressionSyntax from 'uint itemID' at character 1244
 in 'out '
   at ICSharpCode.CodeConverter.VB.CSharpConverter.MethodBodyVisitor.DefaultVisit(SyntaxNode node)
   at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxVisitor`1.VisitDeclarationExpression(DeclarationExpressionSyntax node)
   at Microsoft.CodeAnalysis.CSharp.Syntax.DeclarationExpressionSyntax.Accept[TResult](CSharpSyntaxVisitor`1 visitor)
   at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxVisitor`1.Visit(SyntaxNode node)
   at ICSharpCode.CodeConverter.VB.CommentConvertingMethodBodyVisitor.DefaultVisit(SyntaxNode node)
   at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxVisitor`1.VisitDeclarationExpression(DeclarationExpressionSyntax node)
   at Microsoft.CodeAnalysis.CSharp.Syntax.DeclarationExpressionSyntax.Accept[TResult](CSharpSyntaxVisitor`1 visitor)
   at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxVisitor`1.Visit(SyntaxNode node)
   at ICSharpCode.CodeConverter.VB.CSharpConverter.NodesVisitor.DefaultVisit(SyntaxNode node)
   at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxVisitor`1.VisitDeclarationExpression(DeclarationExpressionSyntax node)
   at Microsoft.CodeAnalysis.CSharp.Syntax.DeclarationExpressionSyntax.Accept[TResult](CSharpSyntaxVisitor`1 visitor)
   at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxVisitor`1.Visit(SyntaxNode node)
   at ICSharpCode.CodeConverter.VB.CommentConvertingNodesVisitor.DefaultVisit(SyntaxNode node)
   ...

Proposal

Hoist the declaration above the block. May need to check for name uniqueness depending on scope. This logic may be reused by #63

ObjectMemberInitializerSyntax - NotImplementedException

Similar to my previous issue.
Here's an example that throws the error:

Dim obj as New NameValue With
{
    .Name = "Hello",
    .Value = "World"
}

Expected

NameValue obj = new NameValue
{
    Name = "Hello",
    Value = "World"
};
Error message:
----- Exception 1 of 1 -----
System.NotImplementedException: Microsoft.CodeAnalysis.VisualBasic.Syntax.ObjectMemberInitializerSyntax not implemented!
   at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.DefaultVisit(SyntaxNode node)
   at Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxVisitor`1.VisitObjectMemberInitializer(ObjectMemberInitializerSyntax node)
   at Microsoft.CodeAnalysis.VisualBasic.Syntax.ObjectMemberInitializerSyntax.Accept[TResult](VisualBasicSyntaxVisitor`1 visitor)
   at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.VisitObjectCreationExpression(ObjectCreationExpressionSyntax node)
   at Microsoft.CodeAnalysis.VisualBasic.Syntax.ObjectCreationExpressionSyntax.Accept[TResult](VisualBasicSyntaxVisitor`1 visitor)
   at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.VisitSingleLineLambdaExpression(SingleLineLambdaExpressionSyntax node)
   at Microsoft.CodeAnalysis.VisualBasic.Syntax.SingleLineLambdaExpressionSyntax.Accept[TResult](VisualBasicSyntaxVisitor`1 visitor)
   at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.VisitSimpleArgument(SimpleArgumentSyntax node)
   at Microsoft.CodeAnalysis.VisualBasic.Syntax.SimpleArgumentSyntax.Accept[TResult](VisualBasicSyntaxVisitor`1 visitor)
   at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.<VisitArgumentList>b__56_0(ArgumentSyntax a)
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   at Microsoft.CodeAnalysis.CSharp.SyntaxFactory.SeparatedList[TNode](IEnumerable`1 nodes)
   at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.VisitArgumentList(ArgumentListSyntax node)
   at Microsoft.CodeAnalysis.VisualBasic.Syntax.ArgumentListSyntax.Accept[TResult](VisualBasicSyntaxVisitor`1 visitor)
   at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.VisitInvocationExpression(InvocationExpressionSyntax node)
   at Microsoft.CodeAnalysis.VisualBasic.Syntax.InvocationExpressionSyntax.Accept[TResult](VisualBasicSyntaxVisitor`1 visitor)
   at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.VisitMemberAccessExpression(MemberAccessExpressionSyntax node)
   at Microsoft.CodeAnalysis.VisualBasic.Syntax.MemberAccessExpressionSyntax.Accept[TResult](VisualBasicSyntaxVisitor`1 visitor)
   at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.VisitInvocationExpression(InvocationExpressionSyntax node)
   at Microsoft.CodeAnalysis.VisualBasic.Syntax.InvocationExpressionSyntax.Accept[TResult](VisualBasicSyntaxVisitor`1 visitor)
   at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.SplitVariableDeclarations(VariableDeclaratorSyntax declarator, NodesVisitor nodesVisitor, SemanticModel semanticModel)
   at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.MethodBodyVisitor.VisitLocalDeclarationStatement(LocalDeclarationStatementSyntax node)
   at Microsoft.CodeAnalysis.VisualBasic.Syntax.LocalDeclarationStatementSyntax.Accept[TResult](VisualBasicSyntaxVisitor`1 visitor)
   at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.<>c__DisplayClass28_0.<VisitMethodBlock>b__1(StatementSyntax s)
   at System.Linq.Enumerable.<SelectManyIterator>d__17`2.MoveNext()
   at Microsoft.CodeAnalysis.SyntaxList`1.CreateNode(IEnumerable`1 nodes)
   at Microsoft.CodeAnalysis.CSharp.SyntaxFactory.Block(IEnumerable`1 statements)
   at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.VisitMethodBlock(MethodBlockSyntax node)
   at Microsoft.CodeAnalysis.VisualBasic.Syntax.MethodBlockSyntax.Accept[TResult](VisualBasicSyntaxVisitor`1 visitor)
   at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.<ConvertMembers>b__15_0(StatementSyntax m)
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.<ConvertMembers>d__15.MoveNext()
   at Microsoft.CodeAnalysis.SyntaxList`1.CreateNode(IEnumerable`1 nodes)
   at Microsoft.CodeAnalysis.SyntaxList`1..ctor(IEnumerable`1 nodes)
   at Microsoft.CodeAnalysis.CSharp.SyntaxFactory.List[TNode](IEnumerable`1 nodes)
   at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.VisitClassBlock(ClassBlockSyntax node)
   at Microsoft.CodeAnalysis.VisualBasic.Syntax.ClassBlockSyntax.Accept[TResult](VisualBasicSyntaxVisitor`1 visitor)
   at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.<VisitNamespaceBlock>b__14_0(StatementSyntax m)
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   at Microsoft.CodeAnalysis.SyntaxList`1.CreateNode(IEnumerable`1 nodes)
   at Microsoft.CodeAnalysis.SyntaxList`1..ctor(IEnumerable`1 nodes)
   at Microsoft.CodeAnalysis.CSharp.SyntaxFactory.List[TNode](IEnumerable`1 nodes)
   at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.VisitNamespaceBlock(NamespaceBlockSyntax node)
   at Microsoft.CodeAnalysis.VisualBasic.Syntax.NamespaceBlockSyntax.Accept[TResult](VisualBasicSyntaxVisitor`1 visitor)
   at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.<VisitCompilationUnit>b__12_1(StatementSyntax m)
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   at Microsoft.CodeAnalysis.SyntaxList`1.CreateNode(IEnumerable`1 nodes)
   at Microsoft.CodeAnalysis.SyntaxList`1..ctor(IEnumerable`1 nodes)
   at Microsoft.CodeAnalysis.CSharp.SyntaxFactory.List[TNode](IEnumerable`1 nodes)
   at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.VisitCompilationUnit(CompilationUnitSyntax node)
   at Microsoft.CodeAnalysis.VisualBasic.Syntax.CompilationUnitSyntax.Accept[TResult](VisualBasicSyntaxVisitor`1 visitor)
   at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.Convert(VisualBasicSyntaxNode input, SemanticModel semanticModel, Document targetDocument)
   at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.ConvertText(String text, MetadataReference[] references)

Known limitations

Visual studio versions

For the VS extension, only VS2019 and VS2022 are supported. Since there is a free version of VS2022 community edition, it isn't worth the effort to continue supporting older versions which can instead be directed to better quality code conversion - the main purpose of this tool.

If you have a project type that doesn't even load in VS2019+, you can try the command line converter, or manually install 8.5.0 - the last release that supported VS2017.


Conversion issues

For discovering issues, the easiest way is to put other open source projects through the converter. One good example is this attempt to use all types of C# syntax in one file.

Awaiting user request/repro/confirmation

These should be broken out into actual issue descriptions when a repro is available.

  • MyNamespace.Dynamic .designer.cs not created for sdk-style project
  • Type conversion may not work for attribute constructors that take an enum but have integer and object overloads

Common cases may be implemented on popular request

  • #Pragma preprocessor directives
  • Many different project types exist (ASP NET, Winforms, WPF, MAUI, etc.). The project file conversion just applies some simple transforms to the xml - I know of no more general approach (there's nothing similar to the roslyn library for editing those files), so each special case that differs between vb and cs must be fixed as it's found.
  • Non-compiling solutions (e.g. missing references).
    • In general this is an impossible problem to solve, because the information just isn't present, but if there are particularly common cases where we could use a heuristic to guess correctly more of the time, their implementation will be considered.

VB to C#:

  • Exponentiation (^) and Like operator overloads cannot be converted, there is no equivalent
    • It would be possible to turn them into normal methods, and call those methods from other code that's being converted, though the public API would be different.

Very unlikely to happen

These things have no direct equivalent in the target language, and are therefore difficult to convert, and even if converted would probably yield ugly code. Therefore they are unlikely to be worked on unless there's significant need for them.

Please comment if you want to encourage others to work on, or work on yourself, or have an idea for how a subset of the functionality could be simply implemented to cover common cases.

  • Using statements removed in snippet conversion when the referenced library isn't known, but part of the namespace is: #529
    • This is unsolvable in general since arbitrary libraries can extend any namespace

C# to VB:

  • #if directives #489
  • Unsafe code cannot be converted in general, there is no equivalent
    • The recommended approach would be to move the unsafe code into a C# assembly and reference it there. This usually works well since it's usually low level code with few dependencies.
    • Note: In some cases, you may be able to use Span and Memory rather than pointers to avoid needing unsafe
  • Syntax from beyond C# 8 isn't supported. There are no plans to do so, though I'm happy to assist someone in learning what's needed.

VB to C#

  • Late bound calls: In VB If you pass an object type as a parameter where there are two possible non-object overloads, the compiler calls NewLateBinding.LateCall at runtime to decide which method to call. Before converting to C#, these should be converted manually to resolve the overload at compile time. #636
    • Considering using dynamic to solve some of these cases, though will likely be imperfect: #782, #783, #786
  • Checked/unchecked operations. e.g. I think For...To loop always uses unchecked addition so it can wrap around (I've avoided doing this since it will make the extremely common case uglier for the sake of a very rare (probably usually accidental) case)
    • In scope: May need to ensure that the csproj gets the checkforoverflowunderflow property set to the opposite value compared to VB's RemoveIntegerChecks property (taking into account potentially different defaults)

Publish v5.5 VSIX

Minus config dialog this is still the same as the RE extension - we know this will collide if users have both installed, but we cannot tear down the RE functionality first.

C# -> VB: Support Block syntax

Error processing ICSharpCode.CodeConverter\Util\SyntaxTokenExtensions.cs
In 'C:\Users\Graham\Documents\GitHub\CodeConverter\ICSharpCode.CodeConverter\Util\SyntaxTokenExtensions.cs':
System.NotImplementedException: Cannot convert BlockSyntax from '{
					var ...' at character 35965
 in '{
				// look for'
   at ICSharpCode.CodeConverter.VB.CSharpConverter.MethodBodyVisitor.DefaultVisit(SyntaxNode node)
   at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxVisitor`1.VisitBlock(BlockSyntax node)
   at Microsoft.CodeAnalysis.CSharp.Syntax.BlockSyntax.Accept[TResult](CSharpSyntaxVisitor`1 visitor)
   at ICSharpCode.CodeConverter.VB.CSharpConverter.MethodBodyVisitor.<ConvertBlock>b__39_1(StatementSyntax s)
   at System.Linq.Enumerable.<SelectManyIterator>d__17`2.MoveNext()
   at Microsoft.CodeAnalysis.SyntaxList`1.CreateNode(IEnumerable`1 nodes)
   at Microsoft.CodeAnalysis.SyntaxList`1..ctor(IEnumerable`1 nodes)
   at Microsoft.CodeAnalysis.VisualBasic.SyntaxFactory.List[TNode](IEnumerable`1 nodes)
   at ICSharpCode.CodeConverter.VB.CSharpConverter.MethodBodyVisitor.ConvertBlock(StatementSyntax node)
   at ICSharpCode.CodeConverter.VB.CSharpConverter.MethodBodyVisitor.VisitDoStatement(DoStatementSyntax node)
   at Microsoft.CodeAnalysis.CSharp.Syntax.DoStatementSyntax.Accept[TResult](CSharpSyntaxVisitor`1 visitor)
   at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxVisitor`1.Visit(SyntaxNode node)
   at ICSharpCode.CodeConverter.VB.CommentConvertingMethodBodyVisitor.DefaultVisit(SyntaxNode node)
   at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxVisitor`1.VisitDoStatement(DoStatementSyntax node)
   at Microsoft.CodeAnalysis.CSharp.Syntax.DoStatementSyntax.Accept[TResult](CSharpSyntaxVisitor`1 visitor)
   at ICSharpCode.CodeConverter.VB.CSharpConverter.NodesVisitor.<>c__DisplayClass34_0.<VisitMethodDeclaration>b__0(StatementSyntax s)
   at System.Linq.Enumerable.<SelectManyIterator>d__17`2.MoveNext()
   at Microsoft.CodeAnalysis.SyntaxList`1.CreateNode(IEnumerable`1 nodes)
   at Microsoft.CodeAnalysis.SyntaxList`1..ctor(IEnumerable`1 nodes)
   at Microsoft.CodeAnalysis.VisualBasic.SyntaxFactory.List[TNode](IEnumerable`1 nodes)
   at ICSharpCode.CodeConverter.VB.CSharpConverter.NodesVisitor.VisitMethodDeclaration(MethodDeclarationSyntax node)
   at Microsoft.CodeAnalysis.CSharp.Syntax.MethodDeclarationSyntax.Accept[TResult](CSharpSyntaxVisitor`1 visitor)
   at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxVisitor`1.Visit(SyntaxNode node)
   at ICSharpCode.CodeConverter.VB.CommentConvertingNodesVisitor.DefaultVisit(SyntaxNode node)
   at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxVisitor`1.VisitMethodDeclaration(MethodDeclarationSyntax node)
   at Microsoft.CodeAnalysis.CSharp.Syntax.MethodDeclarationSyntax.Accept[TResult](CSharpSyntaxVisitor`1 visitor)
   at ICSharpCode.CodeConverter.VB.CSharpConverter.NodesVisitor.<VisitClassDeclaration>b__24_0(MemberDeclarationSyntax m)
   ...

Example input:

    public static void TestMethod()
    {
        {
            var x = 1;
            Console.WriteLine(x);
        }
        {
            var x = 2;
            Console.WriteLine(x);
        }
    }

C#->VB.NET - AddressOf is missing

Originally raised icsharpcode/RefactoringEssentials#234

I tried to convert the following example snippet with the Roslyn Code Converter but it is not translated properly.

public void Run()
{
    RenderLoop.Run(renderForm, RenderCallback);
}

private void RenderCallback()
{
}

This is the result:

Public Sub Run()
    RenderLoop.Run(renderForm, RenderCallback)
End Sub

Private Sub RenderCallback()
End Sub

And this is the expected result, using the AddressOf keyword to get the reference to the RenderCallback sub.

Public Sub Run()
    RenderLoop.Run(renderForm, AddressOf RenderCallback)
End Sub

Private Sub RenderCallback()
End Sub

Error during conversion

When attempting to convert from C#, I'm getting this exception:

Selected C# code seems to have errors or to be incomplete:

System.NotImplementedException: Microsoft.CodeAnalysis.CSharp.Syntax.IncompleteMemberSyntax not implemented!
   at ICSharpCode.CodeConverter.VB.CSharpConverter.NodesVisitor.DefaultVisit(SyntaxNode node)
   at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxVisitor`1.VisitIncompleteMember(IncompleteMemberSyntax node)
   at Microsoft.CodeAnalysis.CSharp.Syntax.IncompleteMemberSyntax.Accept[TResult](CSharpSyntaxVisitor`1 visitor)
   at ICSharpCode.CodeConverter.VB.CSharpConverter.NodesVisitor.<VisitCompilationUnit>b__14_1(MemberDeclarationSyntax m)
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   at Microsoft.CodeAnalysis.SyntaxList`1.CreateNode(IEnumerable`1 nodes)
   at ICSharpCode.CodeConverter.VB.CSharpConverter.NodesVisitor.VisitCompilationUnit(CompilationUnitSyntax node)
   at Microsoft.CodeAnalysis.CSharp.Syntax.CompilationUnitSyntax.Accept[TResult](CSharpSyntaxVisitor`1 visitor)
   at ICSharpCode.CodeConverter.VB.CSharpConverter.Convert(CSharpSyntaxNode input, SemanticModel semanticModel, Document targetDocument)
   at ICSharpCode.CodeConverter.VB.CSharpConverter.ConvertText(String text, MetadataReference[] references)

Here's the code I'm trying to convert:

Public Class TestClass
{
    Public void TestMethod()
    {
        Console.WriteLine("This is a test.");
    }
}

C# -> VB: Support Throw Expressions

  Error processing Vsix\ConvertCSToVBCommand.cs
    In 'C:\Users\Graham\Documents\GitHub\CodeConverter\Vsix\ConvertCSToVBCommand.cs':
    System.NotImplementedException: Cannot convert ThrowExpressionSyntax from 'throw new ArgumentNullExcep...' at character 2446
     in 'package ?? '
       at ICSharpCode.CodeConverter.VB.CSharpConverter.MethodBodyVisitor.DefaultVisit(SyntaxNode node)
       at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxVisitor`1.VisitThrowExpression(ThrowExpressionSyntax node)
       at Microsoft.CodeAnalysis.CSharp.Syntax.ThrowExpressionSyntax.Accept[TResult](CSharpSyntaxVisitor`1 visitor)
       at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxVisitor`1.Visit(SyntaxNode node)
       at ICSharpCode.CodeConverter.VB.CommentConvertingMethodBodyVisitor.DefaultVisit(SyntaxNode node)
       at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxVisitor`1.VisitThrowExpression(ThrowExpressionSyntax node)
       at Microsoft.CodeAnalysis.CSharp.Syntax.ThrowExpressionSyntax.Accept[TResult](CSharpSyntaxVisitor`1 visitor)
       at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxVisitor`1.Visit(SyntaxNode node)
       at ICSharpCode.CodeConverter.VB.CSharpConverter.NodesVisitor.DefaultVisit(SyntaxNode node)
       at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxVisitor`1.VisitThrowExpression(ThrowExpressionSyntax node)
       at Microsoft.CodeAnalysis.CSharp.Syntax.ThrowExpressionSyntax.Accept[TResult](CSharpSyntaxVisitor`1 visitor)
       at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxVisitor`1.Visit(SyntaxNode node)
       at ICSharpCode.CodeConverter.VB.CommentConvertingNodesVisitor.DefaultVisit(SyntaxNode node)
       ...

Option 1

Add a ThrowEx method that's something like

Private Shared Function ThrowEx(Of T)(ByVal e As Exception) As T
    Throw e
End Function

Calling code

ThrowEx(Of Integer)(New Exception)

Then just replace the throw expression with a call to that. The generic is so that the rest of the expression can get the right type. It's a bit messy, and needs to add a method which is awkward for snipped conversions, but does keep the code pretty readable in the context it was written.

Option 2

Define a function outside the block, then use it where the original throw would have been

        Dim throwEx As Func(Of Integer) = 
                Function()
            Throw New Exception
        End Function
        Dim asd = IIf(True, 9, throwEx())

This avoids having to add an extra method at the class level (which means sub-method snippets will convert less cleanly), at the expense of more code for each time this is used.

Proposal

Option 1. We can always implement option 2 as a special case if someone's particularly enthusiastic about it.

convert and copy to clipboard for vsix

Please, bring back convert and copy to clipboard behavior back for vsix.
It was more useful with the exception message box. Showing exception in output window is not better too.

VB -> C#: Operator overload support

Example Input (we should test other operator overloads too):

[Fact]
public void PlusToken()
{
TestConversionVisualBasicToCSharp(@"Public Class AcmeClass
Public Shared Operator +(i As Integer, ac As AcmeClass) As Integer
Return 0
End Operator
End Class", @"using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualBasic;

public class AcmeClass
{
public static int operator +(int i, AcmeClass ac)
{
return 0;
}
}");
}

Originally reported here #29 (comment)

C# -> VB: Delegate with no parmaeters throws NullReferenceException

When converting from C# to VB I get the following error when processing the attached file [MyPublisher.zip]:

Error processing WCFEventService\MyPublisher.cs
In 'C:\Users\kevin.whitefoot\source\Workspaces\Tstat\tutorials\wcf\wcftutorial.net-WCF-Events\WCFEventService\MyPublisher.cs':
System.NullReferenceException
(https://github.com/icsharpcode/CodeConverter/files/1815314/MyPublisher.zip)

: Object reference not set to an instance of an object.
at ICSharpCode.CodeConverter.VB.CSharpConverter.NodesVisitor.VisitAnonymousMethodExpression(AnonymousMethodExpressionSyntax node)
at Microsoft.CodeAnalysis.CSharp.Syntax.AnonymousMethodExpressionSyntax.Accept[TResult](CSharpSyntaxVisitor1 visitor) at ICSharpCode.CodeConverter.VB.CSharpConverter.RemodelVariableDeclaration(VariableDeclarationSyntax declaration, CSharpSyntaxVisitor1 nodesVisitor)
at ICSharpCode.CodeConverter.VB.CSharpConverter.NodesVisitor.VisitFieldDeclaration(FieldDeclarationSyntax node)
at Microsoft.CodeAnalysis.CSharp.Syntax.FieldDeclarationSyntax.Accept[TResult](CSharpSyntaxVisitor1 visitor) at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxVisitor1.Visit(SyntaxNode node)
at ICSharpCode.CodeConverter.VB.CommentConvertingNodesVisitor.DefaultVisit(SyntaxNode node)
at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxVisitor1.VisitFieldDeclaration(FieldDeclarationSyntax node) at Microsoft.CodeAnalysis.CSharp.Syntax.FieldDeclarationSyntax.Accept[TResult](CSharpSyntaxVisitor1 visitor)
at ICSharpCode.CodeConverter.VB.CSharpConverter.NodesVisitor.b__24_0(MemberDeclarationSyntax m)
at System.Linq.Enumerable.WhereSelectEnumerableIterator2.MoveNext() at System.Collections.Generic.List1..ctor(IEnumerable1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable1 source)
at ICSharpCode.CodeConverter.VB.CSharpConverter.NodesVisitor.VisitClassDeclaration(ClassDeclarationSyntax node)
at Microsoft.CodeAnalysis.CSharp.Syntax.ClassDeclarationSyntax.Accept[TResult](CSharpSyntaxVisitor1 visitor) at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxVisitor1.Visit(SyntaxNode node)
at ICSharpCode.CodeConverter.VB.CommentConvertingNodesVisitor.DefaultVisit(SyntaxNode node)
at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxVisitor1.VisitClassDeclaration(ClassDeclarationSyntax node) at Microsoft.CodeAnalysis.CSharp.Syntax.ClassDeclarationSyntax.Accept[TResult](CSharpSyntaxVisitor1 visitor)
at ICSharpCode.CodeConverter.VB.CSharpConverter.NodesVisitor.b__22_0(MemberDeclarationSyntax m)
at System.Linq.Enumerable.WhereSelectEnumerableIterator2.MoveNext() at Microsoft.CodeAnalysis.SyntaxList1.CreateNode(IEnumerable1 nodes) at ICSharpCode.CodeConverter.VB.CSharpConverter.NodesVisitor.VisitNamespaceDeclaration(NamespaceDeclarationSyntax node) at Microsoft.CodeAnalysis.CSharp.Syntax.NamespaceDeclarationSyntax.Accept[TResult](CSharpSyntaxVisitor1 visitor)
at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxVisitor1.Visit(SyntaxNode node) at ICSharpCode.CodeConverter.VB.CommentConvertingNodesVisitor.DefaultVisit(SyntaxNode node) at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxVisitor1.VisitNamespaceDeclaration(NamespaceDeclarationSyntax node)
at Microsoft.CodeAnalysis.CSharp.Syntax.NamespaceDeclarationSyntax.Accept[TResult](CSharpSyntaxVisitor1 visitor) at ICSharpCode.CodeConverter.VB.CSharpConverter.NodesVisitor.<VisitCompilationUnit>b__16_1(MemberDeclarationSyntax m) at System.Linq.Enumerable.WhereSelectEnumerableIterator2.MoveNext()
at Microsoft.CodeAnalysis.SyntaxList1.CreateNode(IEnumerable1 nodes)
at ICSharpCode.CodeConverter.VB.CSharpConverter.NodesVisitor.VisitCompilationUnit(CompilationUnitSyntax node)
at Microsoft.CodeAnalysis.CSharp.Syntax.CompilationUnitSyntax.Accept[TResult](CSharpSyntaxVisitor1 visitor) at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxVisitor1.Visit(SyntaxNode node)
at ICSharpCode.CodeConverter.VB.CommentConvertingNodesVisitor.DefaultVisit(SyntaxNode node)
at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxVisitor1.VisitCompilationUnit(CompilationUnitSyntax node) at Microsoft.CodeAnalysis.CSharp.Syntax.CompilationUnitSyntax.Accept[TResult](CSharpSyntaxVisitor1 visitor)
at ICSharpCode.CodeConverter.VB.CSharpConverter.ConvertCompilationTree(CSharpCompilation compilation, CSharpSyntaxTree tree)
at ICSharpCode.CodeConverter.CSharp.CSToVBConversion.SingleFirstPass(Compilation sourceCompilation, SyntaxTree tree)
at ICSharpCode.CodeConverter.Shared.ProjectConversion`1.FirstPass()

#region preprocessor directives not converted

Sorry, my friend, this is very interesting project to me, because I write in rare lang VB.NET, but any call your converter induce error below. This is input C# code for call this issue ( from wordwide C# example "contoso university").

#define Final // or Intro

#if Intro
#region snippet_Intro
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;

namespace ContosoUniversity.Models
{
    public class Course
    {
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        public int CourseID { get; set; }
        public string Title { get; set; }
        public int Credits { get; set; }

        public ICollection<Enrollment> Enrollments { get; set; }
    }
}
#endregion

#elif Final
#region snippet_Final
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace ContosoUniversity.Models
{
    public class Course
    {
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        [Display(Name = "Number")]
        public int CourseID { get; set; }

        [StringLength(50, MinimumLength = 3)]
        public string Title { get; set; }

        [Range(0, 5)]
        public int Credits { get; set; }

        public int DepartmentID { get; set; }

        public Department Department { get; set; }
        public ICollection<Enrollment> Enrollments { get; set; }
        public ICollection<CourseAssignment> CourseAssignments { get; set; }
    }
}
#endregion
#endif


---------------------------
Microsoft Visual Studio
---------------------------
Convert C# to VB:

Selected C# code seems to have errors or to be incomplete:



----- Exception 1 of 1 -----

System.InvalidOperationException: Nullable object must have a value.
   at System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource)
   at ICSharpCode.CodeConverter.VB.CSharpConverter.NodesVisitor.ConvertAndSplitAttributes(SyntaxList`1 attributeLists, SyntaxList`1& attributes, SyntaxList`1& returnAttributes)
   at ICSharpCode.CodeConverter.VB.CSharpConverter.NodesVisitor.VisitPropertyDeclaration(PropertyDeclarationSyntax node)
   at Microsoft.CodeAnalysis.CSharp.Syntax.PropertyDeclarationSyntax.Accept[TResult](CSharpSyntaxVisitor`1 visitor)
   at ICSharpCode.CodeConverter.VB.CSharpConverter.NodesVisitor.<VisitClassDeclaration>b__22_0(MemberDeclarationSyntax m)
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at ICSharpCode.CodeConverter.VB.CSharpConverter.NodesVisitor.VisitClassDeclaration(ClassDeclarationSyntax node)
   at Microsoft.CodeAnalysis.CSharp.Syntax.ClassDeclarationSyntax.Accept[TResult](CSharpSyntaxVisitor`1 visitor)
   at ICSharpCode.CodeConverter.VB.CSharpConverter.NodesVisitor.<VisitNamespaceDeclaration>b__20_0(MemberDeclarationSyntax m)
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   at Microsoft.CodeAnalysis.SyntaxList`1.CreateNode(IEnumerable`1 nodes)
   at ICSharpCode.CodeConverter.VB.CSharpConverter.NodesVisitor.VisitNamespaceDeclaration(NamespaceDeclarationSyntax node)
   at Microsoft.CodeAnalysis.CSharp.Syntax.NamespaceDeclarationSyntax.Accept[TResult](CSharpSyntaxVisitor`1 visitor)
   at ICSharpCode.CodeConverter.VB.CSharpConverter.NodesVisitor.<VisitCompilationUnit>b__14_1(MemberDeclarationSyntax m)
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   at Microsoft.CodeAnalysis.SyntaxList`1.CreateNode(IEnumerable`1 nodes)
   at ICSharpCode.CodeConverter.VB.CSharpConverter.NodesVisitor.VisitCompilationUnit(CompilationUnitSyntax node)
   at Microsoft.CodeAnalysis.CSharp.Syntax.CompilationUnitSyntax.Accept[TResult](CSharpSyntaxVisitor`1 visitor)
   at ICSharpCode.CodeConverter.VB.CSharpConverter.Convert(CSharpSyntaxNode input, SemanticModel semanticModel, Document targetDocument)
   at ICSharpCode.CodeConverter.VB.CSharpConverter.ConvertText(String text, MetadataReference[] references)


---------------------------
OK   
---------------------------

Also I start your project in source code and see a code line number with error. Please see below.

Error message:
----- Exception 1 of 1 -----

System.InvalidOperationException: Nullable object must have a value.
   at System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource)
   at System.Nullable`1.get_Value()
   at ICSharpCode.CodeConverter.VB.CSharpConverter.NodesVisitor.ConvertAndSplitAttributes(SyntaxList`1 attributeLists, SyntaxList`1& attributes, SyntaxList`1& returnAttributes) in F:\Projects\CodeConverter-master\ICSharpCode.CodeConverter\VB\NodesVisitor.cs:line 523
   at ICSharpCode.CodeConverter.VB.CSharpConverter.NodesVisitor.VisitPropertyDeclaration(PropertyDeclarationSyntax node) in F:\Projects\CodeConverter-master\ICSharpCode.CodeConverter\VB\NodesVisitor.cs:line 431
   at Microsoft.CodeAnalysis.CSharp.Syntax.PropertyDeclarationSyntax.Accept[TResult](CSharpSyntaxVisitor`1 visitor)
   at ICSharpCode.CodeConverter.VB.CSharpConverter.NodesVisitor.<VisitClassDeclaration>b__22_0(MemberDeclarationSyntax m) in F:\Projects\CodeConverter-master\ICSharpCode.CodeConverter\VB\NodesVisitor.cs:line 206
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at ICSharpCode.CodeConverter.VB.CSharpConverter.NodesVisitor.VisitClassDeclaration(ClassDeclarationSyntax node) in F:\Projects\CodeConverter-master\ICSharpCode.CodeConverter\VB\NodesVisitor.cs:line 206
   at Microsoft.CodeAnalysis.CSharp.Syntax.ClassDeclarationSyntax.Accept[TResult](CSharpSyntaxVisitor`1 visitor)
   at ICSharpCode.CodeConverter.VB.CSharpConverter.NodesVisitor.<VisitNamespaceDeclaration>b__20_0(MemberDeclarationSyntax m) in F:\Projects\CodeConverter-master\ICSharpCode.CodeConverter\VB\NodesVisitor.cs:line 180
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   at Microsoft.CodeAnalysis.SyntaxList`1.CreateNode(IEnumerable`1 nodes)
   at Microsoft.CodeAnalysis.SyntaxList`1..ctor(IEnumerable`1 nodes)
   at Microsoft.CodeAnalysis.VisualBasic.SyntaxFactory.List[TNode](IEnumerable`1 nodes)
   at ICSharpCode.CodeConverter.VB.CSharpConverter.NodesVisitor.VisitNamespaceDeclaration(NamespaceDeclarationSyntax node) in F:\Projects\CodeConverter-master\ICSharpCode.CodeConverter\VB\NodesVisitor.cs:line 182
   at Microsoft.CodeAnalysis.CSharp.Syntax.NamespaceDeclarationSyntax.Accept[TResult](CSharpSyntaxVisitor`1 visitor)
   at ICSharpCode.CodeConverter.VB.CSharpConverter.NodesVisitor.<VisitCompilationUnit>b__14_1(MemberDeclarationSyntax m) in F:\Projects\CodeConverter-master\ICSharpCode.CodeConverter\VB\NodesVisitor.cs:line 118
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   at Microsoft.CodeAnalysis.SyntaxList`1.CreateNode(IEnumerable`1 nodes)
   at Microsoft.CodeAnalysis.SyntaxList`1..ctor(IEnumerable`1 nodes)
   at Microsoft.CodeAnalysis.VisualBasic.SyntaxFactory.List[TNode](IEnumerable`1 nodes)
   at ICSharpCode.CodeConverter.VB.CSharpConverter.NodesVisitor.VisitCompilationUnit(CompilationUnitSyntax node) in F:\Projects\CodeConverter-master\ICSharpCode.CodeConverter\VB\NodesVisitor.cs:line 118
   at Microsoft.CodeAnalysis.CSharp.Syntax.CompilationUnitSyntax.Accept[TResult](CSharpSyntaxVisitor`1 visitor)
   at ICSharpCode.CodeConverter.VB.CSharpConverter.Convert(CSharpSyntaxNode input, SemanticModel semanticModel, Document targetDocument) in F:\Projects\CodeConverter-master\ICSharpCode.CodeConverter\VB\CSharpConverter.cs:line 33
   at ICSharpCode.CodeConverter.VB.CSharpConverter.ConvertText(String text, MetadataReference[] references) in F:\Projects\CodeConverter-master\ICSharpCode.CodeConverter\VB\CSharpConverter.cs:line 46

VB -> C#: Select expressions not supported

Input:

Public Class TestClass
    Shared Function TimeAgo(daysAgo As Integer) As String
        Select Case daysAgo
            Case 1
                Return "1 day ago"
            Case Is > 1
                Return daysAgo & " days ago"
            Case Else
                Return "today"
        End Select
    End Function
End Class

Error:

System.NotSupportedException: Specified method is not supported.
       at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.MethodBodyVisitor.VisitSelectBlock(SelectBlockSyntax node)
       at Microsoft.CodeAnalysis.VisualBasic.Syntax.SelectBlockSyntax.Accept[TResult](VisualBasicSyntaxVisitor`1 visitor)
       at Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxVisitor`1.Visit(SyntaxNode node)
       at ICSharpCode.CodeConverter.CSharp.CommentConvertingMethodBodyVisitor.DefaultVisit(SyntaxNode node)
       at Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxVisitor`1.VisitSelectBlock(SelectBlockSyntax node)
       at Microsoft.CodeAnalysis.VisualBasic.Syntax.SelectBlockSyntax.Accept[TResult](VisualBasicSyntaxVisitor`1 visitor)
       at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.<>c__DisplayClass33_0.<VisitStatements>b__0(StatementSyntax s)
       at System.Linq.Enumerable.<SelectManyIterator>d__17`2.MoveNext()
       at Microsoft.CodeAnalysis.SyntaxList`1.CreateNode(IEnumerable`1 nodes)
       at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.VisitStatements(SyntaxList`1 statements, Boolean isIterator)
       at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.VisitMethodBlock(MethodBlockSyntax node)
       at Microsoft.CodeAnalysis.VisualBasic.Syntax.MethodBlockSyntax.Accept[TResult](VisualBasicSyntaxVisitor`1 visitor)
       at Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxVisitor`1.Visit(SyntaxNode node)
       at ICSharpCode.CodeConverter.CSharp.CommentConvertingNodesVisitor.DefaultVisit(SyntaxNode node)
       at Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxVisitor`1.VisitMethodBlock(MethodBlockSyntax node)
       at Microsoft.CodeAnalysis.VisualBasic.Syntax.MethodBlockSyntax.Accept[TResult](VisualBasicSyntaxVisitor`1 visitor)
       at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.<ConvertMembers>d__19.MoveNext()
       at Microsoft.CodeAnalysis.SyntaxList`1.CreateNode(IEnumerable`1 nodes)
       at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.VisitClassBlock(ClassBlockSyntax node)
       at Microsoft.CodeAnalysis.VisualBasic.Syntax.ClassBlockSyntax.Accept[TResult](VisualBasicSyntaxVisitor`1 visitor)
       at Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxVisitor`1.Visit(SyntaxNode node)
       at ICSharpCode.CodeConverter.CSharp.CommentConvertingNodesVisitor.WithPortedTrivia[TSource,TDest](SyntaxNode node, Func`3 portExtraTrivia)
       at ICSharpCode.CodeConverter.CSharp.CommentConvertingNodesVisitor.VisitClassBlock(ClassBlockSyntax node)
       at Microsoft.CodeAnalysis.VisualBasic.Syntax.ClassBlockSyntax.Accept[TResult](VisualBasicSyntaxVisitor`1 visitor)
       at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.<VisitNamespaceBlock>b__18_0(StatementSyntax m)
       at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
       at Microsoft.CodeAnalysis.SyntaxList`1.CreateNode(IEnumerable`1 nodes)
       at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.VisitNamespaceBlock(NamespaceBlockSyntax node)
       at Microsoft.CodeAnalysis.VisualBasic.Syntax.NamespaceBlockSyntax.Accept[TResult](VisualBasicSyntaxVisitor`1 visitor)
       at Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxVisitor`1.Visit(SyntaxNode node)
       at ICSharpCode.CodeConverter.CSharp.CommentConvertingNodesVisitor.DefaultVisit(SyntaxNode node)
       at Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxVisitor`1.VisitNamespaceBlock(NamespaceBlockSyntax node)
       at Microsoft.CodeAnalysis.VisualBasic.Syntax.NamespaceBlockSyntax.Accept[TResult](VisualBasicSyntaxVisitor`1 visitor)
       at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.<VisitCompilationUnit>b__16_3(StatementSyntax m)
       at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
       at Microsoft.CodeAnalysis.SyntaxList`1.CreateNode(IEnumerable`1 nodes)
       at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.VisitCompilationUnit(CompilationUnitSyntax node)
       at Microsoft.CodeAnalysis.VisualBasic.Syntax.CompilationUnitSyntax.Accept[TResult](VisualBasicSyntaxVisitor`1 visitor)
       at Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxVisitor`1.Visit(SyntaxNode node)
       at ICSharpCode.CodeConverter.CSharp.CommentConvertingNodesVisitor.DefaultVisit(SyntaxNode node)
       at ICSharpCode.CodeConverter.CSharp.CommentConvertingNodesVisitor.VisitCompilationUnit(CompilationUnitSyntax node)
       at Microsoft.CodeAnalysis.VisualBasic.Syntax.CompilationUnitSyntax.Accept[TResult](VisualBasicSyntaxVisitor`1 visitor)
       at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.ConvertCompilationTree(VisualBasicCompilation compilation, VisualBasicSyntaxTree tree)
       at ICSharpCode.CodeConverter.CSharp.VBToCSConversion.SingleFirstPass(Compilation sourceCompilation, SyntaxTree tree)
       at ICSharpCode.CodeConverter.Shared.ProjectConversion`1.FirstPass()

Expected: Convert to when C# keyword

C# -> VB: Support "is pattern expressions"

Error processing ICSharpCode.CodeConverter\CSharp\CompilationErrorFixer.cs
In 'C:\Users\Graham\Documents\GitHub\CodeConverter\ICSharpCode.CodeConverter\CSharp\CompilationErrorFixer.cs':
System.NotImplementedException: Cannot convert IsPatternExpressionSyntax from 'potentiallyRewrittenNode is...' at character 962
 in '('
   at ICSharpCode.CodeConverter.VB.CSharpConverter.MethodBodyVisitor.DefaultVisit(SyntaxNode node)
   at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxVisitor`1.VisitIsPatternExpression(IsPatternExpressionSyntax node)
   at Microsoft.CodeAnalysis.CSharp.Syntax.IsPatternExpressionSyntax.Accept[TResult](CSharpSyntaxVisitor`1 visitor)
   at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxVisitor`1.Visit(SyntaxNode node)
   at ICSharpCode.CodeConverter.VB.CommentConvertingMethodBodyVisitor.DefaultVisit(SyntaxNode node)
   at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxVisitor`1.VisitIsPatternExpression(IsPatternExpressionSyntax node)
   at Microsoft.CodeAnalysis.CSharp.Syntax.IsPatternExpressionSyntax.Accept[TResult](CSharpSyntaxVisitor`1 visitor)
   at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxVisitor`1.Visit(SyntaxNode node)
   at ICSharpCode.CodeConverter.VB.CSharpConverter.NodesVisitor.DefaultVisit(SyntaxNode node)
   at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxVisitor`1.VisitIsPatternExpression(IsPatternExpressionSyntax node)
   at Microsoft.CodeAnalysis.CSharp.Syntax.IsPatternExpressionSyntax.Accept[TResult](CSharpSyntaxVisitor`1 visitor)
   at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxVisitor`1.Visit(SyntaxNode node)
   at ICSharpCode.CodeConverter.VB.CommentConvertingNodesVisitor.DefaultVisit(SyntaxNode node)
   at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxVisitor`1.VisitIsPatternExpression(IsPatternExpressionSyntax node)
   at Microsoft.CodeAnalysis.CSharp.Syntax.IsPatternExpressionSyntax.Accept[TResult](CSharpSyntaxVisitor`1 visitor)
   at ICSharpCode.CodeConverter.VB.CSharpConverter.NodesVisitor.VisitParenthesizedExpression(ParenthesizedExpressionSyntax node)
   at Microsoft.CodeAnalysis.CSharp.Syntax.ParenthesizedExpressionSyntax.Accept[TResult](CSharpSyntaxVisitor`1 visitor)
   at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxVisitor`1.Visit(SyntaxNode node)
   at ICSharpCode.CodeConverter.VB.CommentConvertingNodesVisitor.DefaultVisit(SyntaxNode node)
   ...

Option 1 - duplicate expression

The easiest way to convert this is probably to replace usages of the newly declared name with a cast of the original expression. Though this means the same (potentially expensive or even state-changing) expression may be evaluated multiple times and the repeated cast will look ugly and perform slightly worse.

Option 2 - hoist initialization

The alternative is to hoist the declaration and assignment out the front with a TryCast. With this solution there's potential for evaluating an expression that would not otherwise be evaluated, so if it's used in an else if, that would need to ideally turn into something like

    Else
    Dim casted = TryCast(uncasted)
    If casted Not Nothing Then
       ...

Option 3 - hoist declaration, inline initialization

Hoist just the variable declaration out of the block, and assign to it in the expression:

        Dim x = New TextReader
        Dim casted As StringReader
        If (casted = TryCast(x, StringReader)) IsNot Nothing Then
        End If

Can't do exactly this because VB doesn't allow inline assignment, but we already have a mechanism for doing inline assignment with a helper method.

Option 4 - use local lazy/func

Hoist the declaration and initialization out the front as a Lazy. This ensures it's only evaluated once at the point it's required, though looks a little clunky:

        Dim x = New TextReader
        Dim casted = New Lazy(Of StringReader)(Function() TryCast(x, StringReader))
        If casted.Value IsNot Nothing Then
        End If

Similarly VB has the ability to declare inline functions which pass by reference which means it can actually assign the casted variable

        Dim x = New TextReader
        Dim casted As StringReader
        Dim attemptCast = Function(ByRef output As Object) output = TryCast(x, StringReader)
        If attemptCast(casted) IsNot Nothing Then
        End If

Proposal

Make use of inline assignment helper method with option 3, and the soution to #62
This should give the neatest result at the call site that's closest to matching the C#, and the easiest to refactor from (vs hoisting more of the cast into another helper method).

It'd also be good to ensure the variable declaration is assigned Nothing to avoid compiler warnings.
__Assign's formal parameter should probably also be marked with <Out>, even though the above directly goes against that - this is necessary due to the VB compiler generating a warning irrespective of <Out> dotnet/vblang#67

Double Cast causes exception

(SyntaxNodeOrToken)((SyntaxNode)null)

((SyntaxNode)null) gets to converted, but then it tries to cast a unarySyntax

Unable to cast object of type 'Microsoft.CodeAnalysis.VisualBasic.Syntax.UnaryExpressionSyntax' to type 'Microsoft.CodeAnalysis.VisualBasic.Syntax.TypeSyntax'.

VB project conversion error

When converting part or all of a VB project that references another VB project the following error is displayed and the conversion fails

---------------------------
Microsoft Visual Studio
---------------------------
Code converter

An error has occured during conversion: System.ArgumentException: Reference of type 'Microsoft.CodeAnalysis.VisualBasic.VisualBasicCompilationReference' is not valid for this compilation.

Parameter name: references[14]
   at Microsoft.CodeAnalysis.Compilation.ValidateReferences[T](IEnumerable`1 references)
   at Microsoft.CodeAnalysis.CSharp.CSharpCompilation.Create(String assemblyName, CSharpCompilationOptions options, IEnumerable`1 syntaxTrees, IEnumerable`1 references, CSharpCompilation previousSubmission, Type returnType, Type hostObjectType, Boolean isSubmission)
   at Microsoft.CodeAnalysis.CSharp.CSharpCompilation.Create(String assemblyName, IEnumerable`1 syntaxTrees, IEnumerable`1 references, CSharpCompilationOptions options)
   at ICSharpCode.CodeConverter.CSharp.VBToCSConversion.<.ctor>b__3_0()
   at System.Lazy`1.CreateValue()
   at System.Lazy`1.LazyInitValue()
   at System.Lazy`1.get_Value()
   at ICSharpCode.CodeConverter.CSharp.VBToCSConversion.SingleSecondPass(KeyValuePair`2 cs)
   at ICSharpCode.CodeConverter.Shared.ProjectConversion`1.SingleSecondPass(KeyValuePair`2 cs)
   at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector, IEqualityComparer`1 comparer)
   at ICSharpCode.CodeConverter.Shared.ProjectConversion`1.Convert()
   at ICSharpCode.CodeConverter.Shared.ProjectConversion`1.<ConvertProjects>d__11.MoveNext()
   at CodeConverter.VsExtension.CodeConversion.WriteConvertedFilesAndShowSummary(IEnumerable`1 convertedFiles) in D:\GitWorkspace\CodeConverter\Vsix\CodeConversion.cs:line 55
   at CodeConverter.VsExtension.ConvertVBToCSCommand.<SolutionOrProjectMenuItemCallback>d__21.MoveNext() in D:\GitWorkspace\CodeConverter\Vsix\ConvertVBToCSCommand.cs:line 149
---------------------------
OK   
---------------------------

C# -> VB: VisitEmptyStatement

There is an empty statement in the file CSharp\CommentConvertingNodesVisitor.cs that is preventing it from being converted to VB. I can see 2 options to fix it.

Option 1:

Add to VB\MethodBodyVisitor.cs

public override SyntaxList<StatementSyntax> VisitEmptyStatement(CSS.EmptyStatementSyntax node)
{
	return SyntaxFactory.List<StatementSyntax>();
}

Add a null check in DefaultVisit method in VB\CommentConvertingMethodBodyVisitor.cs

public override SyntaxList<VBSyntax.StatementSyntax> DefaultVisit(SyntaxNode node)
{
	var syntaxNodes = wrappedVisitor.Visit(node);

	if (syntaxNodes == default(SyntaxList<VBSyntax.StatementSyntax>))
		return syntaxNodes;

	// Port trivia to the last statement in the list
	var lastWithConvertedTrivia = triviaConverter.PortConvertedTrivia(node, syntaxNodes.LastOrDefault());
	return syntaxNodes.Replace(syntaxNodes.LastOrDefault(), lastWithConvertedTrivia);
}

Option 2:
Change VisitMethodDeclaration in VB\VB\NodesVisitor.cs at line 388 so the EmptyStatements are not processed. This is what is done in ConvertBlock in VB\VB\MethodBodyVisitor.cs.

VB -> C#: Query Expression Syntax not fully implemented

Tried converting the following...

Large code snippet containing various query syntax Imports System.Data Imports System.IO Imports FCA Imports FCA.Data Imports Legacy
Namespace Admin

    Partial Public Class PrintConsignmentAreaRugCards
        Inherits Page

        Dim _currentUser As MpMembershipUser

        Private Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
            _currentUser = Globals.GetCurrentMpUser()
        End Sub

        Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
            If TextBox1.Text.Trim = String.Empty Then
                MIAIDLabel.Text = "Not found."
                AddLinkButton.Enabled = False
                Exit Sub
            End If

            Using OrderData = New MpOrderDataSet()
                Dim Item =
                        OrderData.GetItemRowByFilter(_currentUser.Location, "reg_num=? AND ptype='29'", TextBox1.Text)
                If Not Item Is Nothing Then
                    MIAIDLabel.Text = Item.mia_id.ToString()
                    AddLinkButton.Enabled = True
                Else
                    MIAIDLabel.Text = "Not found."
                    AddLinkButton.Enabled = False
                End If
            End Using
        End Sub

        Private Sub AddLinkButton_Click(sender As Object, e As EventArgs) Handles AddLinkButton.Click
            If MIAIDLabel.Text.Trim = "" OrElse ListBox1.Items.Cast(Of ListItem).Any(Function(item) item.Value = MIAIDLabel.Text) Then
                Exit Sub
            End If
            ListBox1.Items.Add(New ListItem(TextBox1.Text, MIAIDLabel.Text))
        End Sub

        Private Sub PrintConsignmentAreaRugCards_PreRender(sender As Object, e As EventArgs) Handles Me.PreRender
            If ListBox1.Items.Count = 0 Then
                SheetCountLabel.Text = "No sheets needed."
            Else
                If CDec(ListBox1.Items.Count / 4) = CDec(Math.Truncate(ListBox1.Items.Count / 4)) Then
                    SheetCountLabel.Text = CStr(Math.Truncate(ListBox1.Items.Count / 4)) & " sheets needed."
                Else
                    SheetCountLabel.Text = CStr(Math.Truncate(ListBox1.Items.Count / 4) + 1) & " sheets needed."
                End If
            End If
        End Sub

        Private Sub DeleteLinkButton_Click(sender As Object, e As EventArgs) Handles DeleteLinkButton.Click
            If ListBox1.SelectedIndex = -1 Then Exit Sub
            ListBox1.Items.RemoveAt(ListBox1.SelectedIndex)
        End Sub

        Private Sub PrintThisLabelButton_Click(sender As Object, e As EventArgs) Handles PrintThisLabelButton.Click
            If ListBox1.Items.Count = 0 Then Exit Sub
            Dim MIAIDList As String = String.Join(",", ListBox1.Items.Cast(Of ListItem).Select(Function(item) item.Value))
            'For Each item As ListItem In ListBox1.Items
            '    MIAIDList &= item.Value & ","
            'Next
            'MIAIDList = MIAIDList.TrimEnd(","c)
            GetPicList()
            Dim Query As String = String.Format("SELECT c.desc AS origin," +
"'0'+RIGHT(RTRIM(p1.sty_link),5) AS rug_id," +
"p2.prv_sku,prv_style AS description,'' AS picture," +
"0 AS our_price,0 AS suggested " +
"FROM `..\{0}\item{0}` i " +
"INNER JOIN `..\..\common\prodcat2` p2 ON p2.prv_sku=i.color " +
"INNER JOIN `..\..\common\prodcat1` p1 ON p1.sty_link=p2.sty_link " +
"LEFT JOIN `..\..\common\codes` c ON c.code=p1.attrib_5 " +
"WHERE p1.prodtype='29' AND c.type='A0529' AND i.mia_id IN ({1})", _currentUser.Location, MIAIDList)
            Using Table As DataTable = Service.GetDataTable(_currentUser.Location, Query)
                If Table IsNot Nothing Then
                    If Table.Rows.Count > 0 Then
                        Dim DV As DataView = Table.DefaultView
                        Dim Drv As DataRowView
                        Dim PrvSKU As String
                        Dim SuggestedPrice As Decimal
                        Dim OurPrice As Decimal
                        For i = 0 To DV.Count - 1
                            Drv = DV.Item(i)
                            PrvSKU = CStr(Drv.Item("prv_sku"))
                            SuggestedPrice = 0
                            OurPrice = 0
                            Globals.GetConsignmentAreaRugRetailPrices(PrvSKU, SuggestedPrice, OurPrice)
                            Drv.Item("our_price") = OurPrice
                            Drv.Item("suggested") = SuggestedPrice
                            Drv.Item("picture") = FindPicFilePath(CStr(Drv.Item("rug_id")))
                        Next
                    End If
                    ConsignmentAreaRugCardCrystalReportSource.ReportDocument.SetDataSource(Table)
                    ConsignmentAreaRugCardCrystalReportSource.DataBind()
                    CrystalReportViewer.Visible = True
                End If
            End Using
        End Sub

        Private Shared Sub GetPicList()
            Dim DirectoryInfo As New DirectoryInfo("\\m-5\rugpics")
            SiteSession.Current.AreaRugPicsFileInfoList = DirectoryInfo.GetFiles("*.jpg")
        End Sub

        Private Shared Function FindPicFilePath(picId As String) As String
            For Each FileInfo As FileInfo In From FileInfo1 In SiteSession.Current.AreaRugPicsFileInfoList Where FileInfo1.Name.Substring(0, 6) = picId
                Return FileInfo.FullName
            Next
            Return String.Empty
        End Function

        Private Sub PrintThemAllButton_Click(sender As Object, e As EventArgs) Handles PrintThemAllButton.Click
            GetPicList()
            Dim Query As String =
                    String.Concat("SELECT c.desc AS origin,",
                                  "'0'+RIGHT(RTRIM(p1.sty_link),5) AS rug_id,p2.prv_sku,prv_style AS description,'' AS picture,",
                                  "0 AS our_price,0 AS suggested ",
                                  "FROM prodcat1 p1 ",
                                  "INNER JOIN prodcat2 p2 ",
                                  "ON p1.sty_link=p2.sty_link ",
                                  "LEFT JOIN codes c ",
                                  "ON c.code=p1.attrib_5 ",
                                  "WHERE p1.prodtype='29' ",
                                  "AND c.type='A0529'")
            Using Table As DataTable = Service.GetDataTable("COMMON", Query)
                If Table IsNot Nothing Then
                    If Table.Rows.Count > 0 Then
                        Dim DV As DataView = Table.DefaultView
                        For i = 0 To DV.Count - 1
                            Dim Drv As DataRowView = DV.Item(i)
                            Dim PrvSKU As String = CStr(Drv.Item("prv_sku"))
                            Dim SuggestedPrice As Decimal = 0
                            Dim OurPrice As Decimal = 0
                            ConsignmentAreaRugLabelLayout.GetRetailPrices(PrvSKU, SuggestedPrice, OurPrice)
                            Drv.Item("our_price") = OurPrice
                            Drv.Item("suggested") = SuggestedPrice
                            Drv.Item("picture") = FindPicFilePath(CStr(Drv.Item("rug_id")))
                        Next
                    End If
                    ConsignmentAreaRugCardCrystalReportSource.ReportDocument.SetDataSource(Table)
                    ConsignmentAreaRugCardCrystalReportSource.DataBind()
                    CrystalReportViewer.Visible = True
                End If
            End Using
        End Sub
    End Class
End Namespace

Multiple duplicate imports statements

When converting extension methods Imports System.Runtime.CompilerServices is added for each extension method converted.

Here is the result from converting IAssemblySymbolExtensions.cs

Imports Microsoft.CodeAnalysis
Imports System.Runtime.CompilerServices
Imports System.Runtime.CompilerServices
Imports System.Runtime.CompilerServices

Namespace ICSharpCode.CodeConverter.Util
    Module IAssemblySymbolExtensions
        Private Const AttributeSuffix As String = "Attribute"

        <Extension()>
        Function ContainsNamespaceName(ByVal assemblies As List(Of IAssemblySymbol), ByVal namespaceName As String) As Boolean
            For Each a In assemblies

                If a.NamespaceNames.Contains(namespaceName) Then
                    Return True
                End If
            Next

            Return False
        End Function

        <Extension()>
        Function ContainsTypeName(ByVal assemblies As List(Of IAssemblySymbol), ByVal typeName As String, ByVal Optional tryWithAttributeSuffix As Boolean = False) As Boolean
            If Not tryWithAttributeSuffix Then

                For Each a In assemblies

                    If a.TypeNames.Contains(typeName) Then
                        Return True
                    End If
                Next
            Else
                Dim attributeName = typeName & AttributeSuffix

                For Each a In assemblies
                    Dim typeNames = a.TypeNames

                    If typeNames.Contains(typeName) OrElse typeNames.Contains(attributeName) Then
                        Return True
                    End If
                Next
            End If

            Return False
        End Function

        <Extension()>
        Function IsSameAssemblyOrHasFriendAccessTo(ByVal assembly As IAssemblySymbol, ByVal toAssembly As IAssemblySymbol) As Boolean
            Return Equals(assembly, toAssembly) OrElse (assembly.IsInteractive AndAlso toAssembly.IsInteractive) OrElse toAssembly.GivesAccessTo(assembly)
        End Function
    End Module
End Namespace

Enable checks that test conversion code compiles

Originally this was to track a collection of test improvements, the title has been updated to reflect remaining task.

Either add new tests, or add to the current test harness things like:

  • Test that the input and output of existing tests compiles - they're just text strings and it's easy to accidentally be verifying incorrect behaviour
  • Once the above is done, it may at least be interesting diffing the IL compiled from the input and output (obviously won't match in all cases, but would give great confidence for the ones it works for)
  • Roundtripping e.g. VB -> C# -> VB -> C# and test the results of the first and third conversion are the same (don't expect both VB to be the same in this instance due to whitespace etc.)
  • Tests with self-verifying inputs - i.e. We can run the input and output and check they have the same result.

VB -> C#: With block System.NullReferenceException

The following sample generates the above exception when converting from VB to C#

Private Sub Save()
Using cmd As SqlCommand = new SqlCommand()
With cmd
.ExecuteNonQuery()
End WIth
End Using
End Sub

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.