2013-07-18 25 views
8

Podobna do this, ale z niespodzianką.Opcjonalne parametry VB są wymagane w języku C#

VB deklaracja funkcji:

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 

Dzwoniąc w języku C# (inne rozwiązanie, skopiowane przez .dll)

Error 164 Nie przeciążenie dla metody 'myFunc' trwa 2 argumenty

Metadane pokazuje funkcję, która ma być:

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

Dlaczego jeden Optional przetrwał, a drugi nie?

Odpowiedz

9

C# nie obsługuje opcjonalnych parametrów ref. Jeśli zmienisz obj na parametr ByValue, powinno być dobrze.

Jeśli spróbujesz zadeklarować opcjonalny parametr w C# ref będziesz naruszać punkt 10.6.1 w C# 4 specyfikacji:

A stałym parametrem z default-argumencie jest znany jako opcjonalny parametr .

...

ref lub out parametr nie może mieć default-argumentu.

Wyjątkiem jest COM, gdzie parametry ref są niezwykle częste. Gdy kompilator C# wie, że ma do czynienia ze składnikiem COM, to będzie pozwala pominąć opcjonalne parametry ref.

+0

Z ciekawości, ja zamieniłem kolejność dwóch ostatnich parametrów, projekt C# nie ma problemu przyjmując, że choć metadane to 'public static bool MyFunc (string Name, int Num, int val = 0, ref object obj);' który jest nielegalny. Podczas próby przekazania 2 parametrów otrzymałem komunikat "Brak przeciążenia ... trwa 2 argumenty". Podczas próby przekazania 3 parametrów otrzymałem komunikat "Brak przeciążenia ... trwa 3 argumenty". Ciekawy. – JNF

+0

@JNF: Wyświetlane metadane to tylko reprezentacja C# * tego, co jest w IL. Podejrzewam, że prawdziwe metadane oryginalnej wersji też były w porządku - po prostu to, czego używasz do przetłumaczenia tych metadanych na C#, nie wyszło, co robić. Nie zmieniałbym jednak po prostu kolejności parametrów - jeśli to zadziała, teraz nie ma gwarancji, że tak będzie w przyszłości. Zmieniłbym podpis na coś, co jest również reprezentowalne w C#. –

+0

nie, cóż, tylko ja grałem w Curiousa George'a. Skończyło się na przeciążeniu w VB. – JNF

Powiązane problemy