2013-07-18 11 views
8

Simile a this, ma con una svolta.I parametri VB opzionali sono obbligatori in C#

VB dichiarazione di funzione:

Public Shared Function MyFunc(ByVal Name As String, ByVal Num As Integer, Optional ByRef obj As Object = Nothing, Optional ByVal val As Integer = 0) As Boolean 

Quando si chiama in C# (soluzione diversa, ho copiato il .dll)

Errore 164 Nessun sovraccarico per il metodo 'MyFunc' prende 2 argomenti

I metadati mostrano la funzione da:

public static bool MyFunc(string Name, int Num, ref object obj, int val = 0); 

Perché uno Optional è riuscito a passare mentre l'altro no?

risposta

9

C# non supporta i parametri opzionali ref. Se si modifica obj come un parametro ByValue, dovrebbe andare bene.

Se si tenta di dichiarare un ref parametro opzionale in C#, sarete violano la sezione 10.6.1 del C# 4 spec:

A -parametro fisso con un default-argomento è noto come parametro facoltativo.

...

Un parametro ref o out non può avere un default-argomento.

L'eccezione è per COM, dove i parametri ref sono estremamente comuni. Quando il compilatore C# sa che ha a che fare con un componente COM, lo corrisponderà a consentendo di omettere i parametri opzionali ref.

+0

Per curiosità, ho scambiato l'ordine degli ultimi due parametri, il progetto C# non ha avuto un problema ad accettare che, pur i metadati erano 'public static bool MyFunc (string Name, int Num, int val = 0, ref object obj);' che è illegale. Quando ho provato a passare 2 parametri ho ottenuto il messaggio "Nessun sovraccarico ... richiede 2 argomenti". Quando ho provato a passare 3 parametri ho ottenuto il messaggio "Nessun sovraccarico ... richiede 3 argomenti". Interessante. – JNF

+0

@JNF: I metadati che stai mostrando sono solo una rappresentazione * C * di tutto ciò che c'è nell'IL. Sospetto che anche i veri metadati per la versione originale andassero bene - è solo che qualunque cosa tu stia usando per tradurre i metadati in C# non ha funzionato. Tuttavia, non cambierei solo l'ordine dei parametri: se ciò dovesse funzionare ora, non è garantito che lo farà in futuro. Modificherei la firma in qualcosa che è anche rappresentabile in C#. –

+0

no, beh, quello ero solo io che interpretavo Curious George. Ho finito per sovraccaricare nel VB. – JNF

Problemi correlati