2012-05-25 6 views
5

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.)

+2

rozdzielczości przeciążenia dotyczy „mniej argumentów == lepiej”. –

Odpowiedz

1

Twój problem nie ma nic wspólnego z metodą rozszerzenia. Chodzi o rozdzielczości przeciążenia i opcjonalnymi parametrami. (7.5.3 rozdzielczości przeciążenie C# SPEC) Można spróbować ten kod

public static string NullSafeToString(DateTime? possiblyNullDateTime, string format, string nullString = "") 
    { 
     return string.Empty; 
    } 
    public static string NullSafeToString<T>(Nullable<T> nullable, string nullString = "") where T : struct 
    { 
     return string.Empty; 
    } 
    static void Test() 
    { 
     DateTime? datetime = DateTime.Now; 
     NullSafeToString(datetime, "yyyyMMdd"); 
    } 
+0

Dzięki za odpowiedź. Nadal nie jest jasne, dlaczego jest pobieranie ObjectExtensions.NullSafeToString ponad DateTimeExtensions.NullSafeToString. Od 7.5.3.1: "Jeśli MP jest metodą nietypową, a MQ jest metodą ogólną, to MP jest lepsza niż MQ". Przypuszczam, że w grę wchodzą jeszcze inne zasady, ale nie jestem pewien, który. – Giles

+0

Niestety - to powinno być 7.5.3.2 "Członek lepiej działający". – Giles

Powiązane problemy