Překlad kódu z C# do VB.NET   otázka

C#, VB.NET, Offtopic

Dobrý den,

mám problem s překladem kódu z C# do VB.NET. V C# mám následující kód:

namespace SmartformValidatorTest
{
	class Validator
	{
		private long announceIdCounter = 0;
		private AnnounceResponse lastResponse;

		/// <summary>
		/// Zvaliduje zadanou adresu
		/// </summary>
		/// <param name="fieldValues">mapa policek adresy</param>
		/// <returns>vysledek validace nebo null pri chybe spojeni</returns>
		public AnnounceResponse validate(Dictionary<OracleFieldType, string> fieldValues)
		{
			AnnounceRequest announceRequest = new AnnounceRequest(++announceIdCounter, fieldValues, password);
			lock (this)
			{
				SmartformWsHelper.sendRequest<AnnounceResponse>("announce", announceRequest, announceCallback);
				Monitor.Wait(this, 5000);
				if (lastResponse == null) return null;
				if (lastResponse.Id != announceIdCounter) return null;
				return lastResponse;
			}
		}

		private void announceCallback(AnnounceResponse response)
		{
			lock (this)
			{
				lastResponse = response;
				Monitor.Pulse(this);
			}
		}

		private string password;
		public string Password
		{
			set { password = value; }
		}
	}
}

překlad automatickým překladačem vyhodil toto:

Namespace SmartformValidator

    Class Validator
        Private announceIdCounter As Long = 0
        Private lastResponse As AnnounceResponse

        ''' <summary>
        ''' Zvaliduje zadanou adresu
        ''' </summary>
        ''' <param name="fieldValues">mapa policek adresy</param>
        ''' <returns>vysledek validace nebo null pri chybe spojeni</returns>
        Public Function validate(fieldValues As Dictionary(Of OracleFieldType, String)) As AnnounceResponse
            Dim announceRequest As New AnnounceRequest(System.Threading.Interlocked.Increment(announceIdCounter), fieldValues, m_password)
            SyncLock Me
                'SmartformWsHelper.sendRequest(Of AnnounceResponse)("announce", announceRequest, announceCallback)
                Monitor.Wait(Me, 5000)
                If lastResponse Is Nothing Then
                    Return Nothing
                End If
                If lastResponse.Id <> announceIdCounter Then
                    Return Nothing
                End If
                Return lastResponse
            End SyncLock
        End Function

        Private Sub announceCallback(response As AnnounceResponse)
            SyncLock Me
                lastResponse = response
                Monitor.Pulse(Me)
            End SyncLock
        End Sub

        Private m_password As String

        Public WriteOnly Property Password() As String
            Set(value As String)
                m_password = value
            End Set
        End Property

    End Class

End Namespace

Bohužel přeložený kód hlásí ERR na řádku

SmartformWsHelper.sendRequest(Of AnnounceResponse)("announce", announceRequest, announceCallback)

Error 1 Argument not specified for parameter 'response' of 'Private Sub announceCallback(response As SmartformWsClient.AnnounceResponse)

V původním kódu jsem ale parametr nenašel, i když se přiznám, že C# je pro mě velká neznámá. Můžete mi, prosím poradit, kde vznikla chyba v překladu?

Díky

Martin

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zdravím,

C# je pro mě také neznámá, spíše se mi hůře čte. Ale je to přesně, jak Ti hlásí chyba.

Píšeš:

...("announce", announceRequest, announceCallback)

announceCallback je procedura, která vyžaduje paremetr AnnonceResponse. Bez toho Ti to asi nepůjde. Můžeš zkusit dát announceCallback(Nothing), ale to Ti možná nepůjde. :) Máš k tomu nějakou dokumentaci? Nebo zkus kliknout pravým na AnnonceResponce a dej Go To Definition. Nebo nabízí se Ti Intellisense? Pokud ano, nabízí ta helper metoda nebo co to je nějaké overloads, je přetížená? Jestli třeba by se ten poslední parametr nenechal vynechat, pokud by nabízela pouze string a request, bez toho callbacku, pokud je to jen pro monitoring nebo co...

nahlásit spamnahlásit spam -1 / 3 odpovědětodpovědět

Pokiaľ sa nemýlim, tak tam nie je volanie metódy announceCallback, ale parameter - delegát, teda "odkaz" na metódu announceCallback.

Vo VB.NET je pre delegáty AddressOf, v C# sa napíše názov funkcie bez zátvorky ,

so zátvorkami ide o volanie funkcie.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

ok. tak to možná budeš mít pravdu, pokud v C# není něco, co by viditelně signalizovalo delegát, jako ve VB.NET AddressOf. Já měl prostě za to, že je to volání procedury s parametrem. Měl jsem takové tušení, že na dotaz raději nemám reagovat...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Neviem, či to pomôže, ale skúsil by som dať

SmartformWsHelper.sendRequest(Of AnnounceResponse)("announce", announceRequest, AddressOf announceCallback)
nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback