Search code examples
c#vb.netcode-translation

Converting c# app into VB


I'm converting a C# app to VB but am uncertain regarding some of the resulting errors.

In C# I have-

 var quotesInvoker = new QuotesInvoker(new[] { "EUR=X", "JPY=X" });

Which converts to -

 Dim quotesInvoker = New Reuters_Downloader.HttpSample.Invokers.QuotesInvoker(New () {"EUR=X", "JPY=X"})

However the New () has an error of 'Type Expected' If I modify the code to read -

 Dim quotesInvoker = New Reuters_Downloader.HttpSample.Invokers.QuotesInvoker(CType(New Object() {"EUR=X", "JPY=X"}, String()))

the problem goes away but I don't know if that's a good solution. Any comments?

With this, we have this C# QuotesInvoker code -

 public class QuotesInvoker : IInvoker<RetrieveItem_Request_3, ItemResponse_Short_Or_Full[]>
{
    private readonly string[] rics;

    public QuotesInvoker(string[] rics)
    {
        this.rics = rics;
    }

    public ItemResponse_Short_Or_Full[] Invoke(AuthorizationType authorization, RetrieveItem_Request_3 request)
    {
        var proxy = new Quotes_1Client();
        ItemResponse_Short_Or_Full[] response;
        proxy.RetrieveItem_3(null, authorization, request, out response);
        return response;
    }

    public RetrieveItem_Request_3 CreateRequest()
    {
        var retval = new RetrieveItem_Request_3();
        retval.TrimResponse = false;

        var request = new ItemRequest_2[1];
        var request0 = new ItemRequest_2();
        request0.Fields = "";
        var keys = new List<InstrumentKey_2>();
        foreach(var ric in rics)
        {
            keys.Add(new InstrumentKey_2
            {
                Name = ric,
                NameType = "RIC"
            });
        }
        request0.RequestKey = keys.ToArray();
        request0.ExpandChains = true;
        request0.Scope = Scope.All;
        request[0] = request0;

        retval.ItemRequest = request;
        return retval;
    }
}

which converts to -

    Public Class QuotesInvoker
    Implements IInvoker(Of RetrieveItem_Request_3, ItemResponse_Short_Or_Full())
    Private ReadOnly rics As String()

    Public Sub New(rics As String())
        Me.rics = rics
    End Sub

    Public Function Invoke(authorization As AuthorizationType, request As RetrieveItem_Request_3) As ItemResponse_Short_Or_Full()
        Dim proxy = New Quotes_1Client()
        Dim response As ItemResponse_Short_Or_Full() = Nothing
        proxy.RetrieveItem_3(Nothing, authorization, request, response)
        Return response
    End Function

    Public Function CreateRequest() As RetrieveItem_Request_3
        Dim retval = New RetrieveItem_Request_3()
        retval.TrimResponse = False

        Dim request = New ItemRequest_2(0) {}
        Dim request0 = New ItemRequest_2()
        request0.Fields = ""
        Dim keys = New List(Of InstrumentKey_2)()
        For Each ric In rics
            keys.Add(New InstrumentKey_2() With {  _
                Key .Name = ric, _
                Key .NameType = "RIC" _
            })
        Next
        request0.RequestKey = keys.ToArray()
        request0.ExpandChains = True
        request0.Scope = Scope.All
        request(0) = request0

        retval.ItemRequest = request
        Return retval
    End Function
End Class

this produces an error in line 2 of "Class 'QuotesInvoker' must implement 'Function CreateRequest() As ThomsonReutersKnowledgeDirect.RetrieveItem_Request_3' for interface 'IInvoker(Of ThomsonReutersKnowledgeDirect.RetrieveItem_Request_3, ThomsonReutersKnowledgeDirect.ItemResponse_Short_Or_Full())'."

The 'error free' Vb translation for the "RetrieveItem_Request_3' is -

<System.Diagnostics.DebuggerStepThroughAttribute()> _
<System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")> _
<System.ServiceModel.MessageContractAttribute(IsWrapped:=False)> _
Partial Public Class RetrieveItem_3_RequestMessage

    <System.ServiceModel.MessageHeaderAttribute([Namespace]:="http://www.reuters.com/ns/2008/03/01/webservices/rkd/Cache_1")> _
    Public CacheRequest As ThomsonReutersKnowledgeDirect.CacheRequest

    <System.ServiceModel.MessageHeaderAttribute([Namespace]:="http://www.reuters.com/ns/2006/05/01/webservices/rkd/Common_1")> _
    Public Authorization As ThomsonReutersKnowledgeDirect.AuthorizationType

    <System.ServiceModel.MessageBodyMemberAttribute([Namespace]:="http://www.reuters.com/ns/2006/05/01/webservices/rkd/Quotes_1", Order:=0)> _
    Public RetrieveItem_Request_3 As ThomsonReutersKnowledgeDirect.RetrieveItem_Request_3

    Public Sub New()
    End Sub

    Public Sub New(CacheRequest As ThomsonReutersKnowledgeDirect.CacheRequest, Authorization As ThomsonReutersKnowledgeDirect.AuthorizationType, RetrieveItem_Request_3 As ThomsonReutersKnowledgeDirect.RetrieveItem_Request_3)
        Me.CacheRequest = CacheRequest
        Me.Authorization = Authorization
        Me.RetrieveItem_Request_3 = RetrieveItem_Request_3
    End Sub
End Class

I'm lost with this so would appreciate any help resolving the resulting translation errors. Thanks


Solution

  • Answer to first question: Yes, that is the way. VB compiler needs the array type for that syntax. You can just make a modification:

    Dim quotesInvoker = New Reuters_Downloader.HttpSample.Invokers.QuotesInvoker(New String() {"EUR=X", "JPY=X"})
    

    As for your second error: C# compiler supports implicit implementation of interface members while VB compiler doesn't. So in VB you should always explicitly specify the member to implement:

    Public Function CreateRequest() As RetrieveItem_Request_3 _
        Implements IInvoker(Of ThomsonReutersKnowledgeDirect.RetrieveItem_Request_3, ThomsonReutersKnowledgeDirect.ItemResponse_Short_Or_Full()).CreateRequest