Mam następujący Kilka metod rozszerzeń, które są w tej samej przestrzeni nazw i montażu:rozdzielczości Sposób metod rozszerzenie z opcjonalnymi parametrami
public static class DateTimeExtensions
{
public static string NullSafeToString(this DateTime? possiblyNullDateTime, string format, string nullString = "")
}
public static class NullableExtensions
{
public static string NullSafeToString<T>(this Nullable<T> nullable, string nullString = "") where T : struct
}
Moje pytanie jest o rozdzielczości metody. Poniższa rozmowa (z innej przestrzeni nazw) postanawia ObjectExtensions.NullSafeToString
kiedy oczekiwano DateTimeExtensions.NullSafeToString
:
DateTime? dateTime;
// ...
dateTime.NullSafeToString("yyyyMMdd");
Wyjmowanie opcjonalnego parametru z DateTimeExtensions.NullSafeToString
powoduje to rozwiązać, jak oczekiwano.
Sekcja 7.6.5.2 specyfikacji C# określa kolejność szukanych przestrzeni nazw, ale ponieważ powyższe są w tej samej przestrzeni nazw, oczekiwałbym, że użyje reguł w sekcji 7.6.5.1.
Pomyślałam, że pasuje DateTimeExtensions.NullSafeToString
ponieważ:
- Chociaż oni obaj mają pierwszy typ parametru
Nullable<DateTime>
, myślałem metodę nierodzajową (bez parametru type) będą uważane za pierwszy . - I choć listach parametrów byłoby uznać bez ich parametrów opcjonalnych pierwszych
Może ktoś wyjaśnić, dlaczego to zbieranie ObjectExtensions.NullSafeToString
nad DateTimeExtensions.NullSafeToString
?
(Na marginesie: z innych dyskusji tutaj podejrzewam, że niektórzy ludzie mogą odrzucić użycie semantyki metody rozszerzenia, aby dereferencja była bezpieczna null, ale uważam, że używane w ograniczonych scenariuszach, takich jak ten, zapewniają bardziej czytelny kod. Wiem, że Nullable.ToString
jest już bezpieczny null, ponieważ sam obiekt Nullable
nie ma wartości NULL, ale nie uwzględnia on parametrów zawartych w nim ToString
i stwierdzam, że jawnie określona metoda wskazuje intencję bezpiecznego zerowania.)
rozdzielczości przeciążenia dotyczy „mniej argumentów == lepiej”. –