Czy C # 4.0 pozwala na opcjonalne out
lub ref
argumenty?
c#-4.0
optional-parameters
optional-arguments
Joe Daley
źródło
źródło
null
domyślnej ( pochodzę z PHP ) i testowanie,null
aby kontynuować wypełnianie argumentu ( dla osób dobrze znanych, myślępreg_match()
) W każdym razie, chociaż rozumiem z technicznego punktu widzenia, może to być niemożliwe, a PHP i C # są raczej nieporównywalne, nadal byłoby to „ miłe ” narzędzie, które byłoby dostępne.Odpowiedzi:
Jak już wspomniano, jest to po prostu niedozwolone i myślę, że ma to bardzo dobry sens. Jednak, aby dodać więcej szczegółów, oto cytat ze specyfikacji C # 4.0 , sekcja 21.1:
źródło
Nie.
Obejściem tego problemu jest przeładowanie inną metodą, która nie ma parametrów out / ref i która po prostu wywołuje twoją bieżącą metodę.
Aktualizacja: jeśli masz C # 7.0 , możesz uprościć:
(Dzięki @Oskar / @Reiner za zwrócenie na to uwagi.)
źródło
return SomeMethod(out string temp)
. Zobacz więcej tutaj: blogs.msdn.microsoft.com/dotnet/2016/08/24/…return SomeMethod(out _);
Nie, ale inną świetną alternatywą jest użycie metody z ogólną klasą szablonów dla parametrów opcjonalnych w następujący sposób:
Następnie możesz użyć go w następujący sposób:
źródło
Istnieje sposób na zrobienie tego, który jest dozwolony przez C #. To wraca do C ++ i raczej narusza ładną, obiektową strukturę C #.
ZACHOWAJ TĘ METODĘ Z UWAGĄ!
Oto sposób, w jaki deklarujesz i piszesz swoją funkcję z opcjonalnym parametrem:
Następnie wywołaj funkcję w następujący sposób:
Aby to skompilować, musisz włączyć niebezpieczny kod w opcjach projektu. Jest to naprawdę hacking rozwiązanie, które zwykle nie powinno być stosowane, ale jeśli potrzebujesz jakiejś dziwnej, tajemniczej, tajemniczej decyzji inspirowanej zarządzaniem, NAPRAWDĘ potrzebujesz opcjonalnego parametru out w C #, to pozwoli ci to zrobić.
źródło
ICYMI: Zawarte w nowych funkcjach wymienionych tutaj C # 7.0 , „odrzucanie” jest teraz dozwolone jako parametry wyjściowe w postaci _, co pozwala zignorować parametry, na których ci nie zależy:
p.GetCoordinates(out var x, out _); // I only care about x
PS, jeśli mylisz się także z częścią „out var x”, przeczytaj nową funkcję o „Zmiennych wyjściowych” również w linku.
źródło
Nie, ale możesz użyć delegata (np.
Action
) Jako alternatywy.Zainspirowany częściowo odpowiedzią Robin R, gdy stanąłem przed sytuacją, w której myślałem, że chcę opcjonalnego parametru wyjściowego, zamiast tego użyłem
Action
delegata. Pożyczałem jego przykładowy kod do modyfikacji w celu użyciaAction<int>
w celu pokazania różnic i podobieństw:Ma to tę zaletę, że opcjonalna zmienna pojawia się w źródle jako normalna int (kompilator otacza ją klasą zamknięcia, a nie zawija ją jawnie w klasie zdefiniowanej przez użytkownika).
Zmienna wymaga jawnej inicjalizacji, ponieważ kompilator nie może założyć, że
Action
zostanie wywołany przed zakończeniem wywołania funkcji.Nie nadaje się do wszystkich przypadków użycia, ale działał dobrze w moim prawdziwym przypadku użycia (funkcja, która zapewnia dane do testu jednostkowego, a nowy test jednostkowy wymagał dostępu do niektórych stanów wewnętrznych nieobecnych w wartości zwracanej).
źródło
Użyj metody przeciążonej bez parametru out, aby wywołać metodę z parametrem out dla C # 6.0 i niższych. Nie jestem pewien, dlaczego C # 7.0 dla .NET Core jest nawet poprawną odpowiedzią dla tego wątku, kiedy zapytano go konkretnie, czy C # 4.0 może mieć opcjonalny parametr wyjściowy. Odpowiedź brzmi nie!
źródło
Co powiesz na to?
Nadal musisz przekazać wartość do parametru z C #, ale jest to opcjonalny parametr referencyjny.
źródło
[Optional]
adnotację. To nie pomaga.źródło