2010-10-15 16 views
7

Natknąłem następującym MS jednostka testowa:Jaka jest różnica między tymi dwiema asercjami testu jednostkowego?

[TestMethod] 
public void PersonRepository_AddressCountForSinglePerson_IsNotEqualToZero() 
{ 
    // Arrange. 
    Person person; 

    // Act. 
    person = personRepository.FindSingle(1); 

    // Assert. 
    Assert.AreNotEqual<int>(person.Addresses.Count, 0); 
} 

Nigdy nie widziałem stosowanie leków generycznych, gdy robi twierdzeń.

ten sposób chciałbym napisać twierdzenie:

// Assert. 
Assert.AreNotEqual(person.Addresses.Count, 0); 

Jaka jest różnica?

Po najechaniu kursorem na przeciążenie AreNotEqual() używam, metoda wykorzystuje przeciążenie, które porównuje dwa podwójne (nie wiem, dlaczego nie ma przeciążenia int, int).

A jeśli I do umieścić ogólny parametr typu <int> w, ReSharper mówi, że jest zbędny.

Moje pytanie brzmi: jeśli sposób, w jaki to robię, jest nadal bezpieczny dla typu, dlaczego używa się generycznych twierdzeń?

Odpowiedz

5

Więc moje pytanie jest - jeśli tak jak ja to wciąż typ bezpieczny, dlaczego używać twierdzeń ogólnych?

Teraz używasz generycznego potwierdzenia. Kompilator widzi ogólną metodę i wybiera ją podczas kompilacji. Dlatego Resharper mówi, że <int> jest zbędny - nie dlatego, że metoda jest zbędna, ale raczej, że kompilator może domyślnie określić, że metoda jest właściwa do użycia.

Ogólnie rzecz biorąc, często nie trzeba określać typu na rodzajach ogólnych. To właśnie sprawia, że ​​składnia LINQ jest znoszona - bez niej trzeba by określić typy na każdym wywołaniu metody w łańcuchu, a typy anonimowe byłyby bezużyteczne.

Sądzimy, że w niektórych przypadkach wymagane jest określenie typu ogólnego. Dzieje się tak głównie wtedy, gdy kompilator nie może automatycznie określić typu, na przykład, jeśli nie ma zgodnego parametru na liście argumentów (np. Foo.Create<MyClass>()), lub jeśli typ nie może być określony z innego powodu.

+1

To wyjaśnia bardzo dobrze, dzięki. Zasadniczo nie musimy używać ogólnego parametru typu dla większości asercji typu wartości. Chyba teraz, jeśli kompilator narzeka na niejednoznaczne twierdzenie, będę używał parametru type. Dzięki. – RPM1984

Powiązane problemy