12

Mam dwie metody rozszerzenia:metody rozszerzeń przeciążać wybór

public static IPropertyAssertions<T> ShouldHave<T>(this T subject) 
{ 
    return new PropertyAssertions<T>(subject); 
} 

public static IPropertyAssertions<T> ShouldHave<T>(this IEnumerable<T> subject) 
{ 
    return new CollectionPropertyAssertions<T>(subject); 
} 

Teraz mam napisać kod, który wykorzystuje go:

List<Customer> collection2 = new List<Customer>(); 
collection2.ShouldHave(); //first overload is chosen 
IEnumerable<Customer> collection3 = new List<Customer>(); 
collection3.ShouldHave(); //second overload is chosen 

drugie przeciążenie jest wybrany tylko jeśli jawnie określić typ IEnumerable. Czy istnieje sposób, aby w obu przypadkach wybrać drugie przeciążenie?

+0

Nie będzie różnicy między 'collection1' i' collection2'. Są dokładnie tym samym kodem, tylko napisane inaczej. – svick

+0

@svick, tak, ale chciałem pokazać wszystkie opcje składni – SiberianGuy

+3

Należy pamiętać, że fakt, że jest to metoda rozszerzenia, jest nieistotny; rozdzielczość przeciążenia obsługuje ją jak normalną metodę statyczną. –

Odpowiedz

5

Nie sądzę. Nie sądzę, że jest możliwe, że przeciążenie będzie zawsze wywoływane, ponieważ ma ono zawsze dokładne dopasowanie w odniesieniu do typu w odniesieniu do rodzaju. Jeśli nie podasz konkretnego IEnumerable<T>, najlepszym dopasowaniem będzie zawsze pierwsza metoda, w przypadku w tej przypadku.

7

Pierwsze przeciążenie jest lepszym rozwiązaniem, ponieważ T jest interpretowane jako List<Customer>, co daje dokładne dopasowanie. Dla drugiego przeciążenia, wywnioskuje T jako Customer, więc parametr będzie miał wartość IEnumerable<Customer>, co jest mniej dokładnym dopasowaniem niż List<Customer>.

1

Funkcja ShouldHave() ma podwójne znaczenie. W pierwszym przypadku funkcja ShouldHave() zwraca wartość obiektu dostarczanego przez parametr podmiotu. W drugim przypadku powrót dotyczy elementów w wyliczeniu, a nie samego wyliczenia.

W przypadku, gdy tworzę własną kolekcję i chcę przetestować tę kolekcję (nie elementy), z pewnością chcę, aby ShouldHave (ten przedmiot T) był wywoływany, a nie ShouldHave (this IEnumerable subject).

Może powinieneś rozważyć swój projekt. Druga funkcja ShouldHave() wykonuje dwie czynności, należy więc podzielić ją na metodę, która wyodrębnia elementy kolekcji i wywołanie pierwszej funkcji ShouldHave(), którą już masz.

+0

Dokładnie to próbujemy do zrobienia, ale mamy pewne problemy z przeciążeniem kompilatora C#. –

+0

Kompilator C# jest poprawny pod tym względem, że preferuje idealne dopasowanie w porównaniu z dopasowaniem, które wymaga najpierw typowania. Myślę, że twój projekt jest niedoskonały i chcesz go rozwiązać, ponieważ kompilator C# jest również niedoskonały. Co, jeśli rzeczywiście chcę zastosować ShouldHave (ten przedmiot T) do mojej kolekcji? Dlaczego chcesz zablokować ten scenariusz? –

+0

Lubię być niedoskonały :-) –

Powiązane problemy