Подтвердить что ты не робот

Выбор перегрузки методом расширения

У меня есть два метода расширения:

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);
}

Теперь я пишу код, который его использует:

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

Вторая перегрузка выбирается, только если я явно укажу тип IEnumerable. Есть ли способ сделать вторую перегрузку в обоих случаях?

4b9b3361

Ответ 2

Первая перегрузка - лучшее совпадение, поскольку T выводится как List<Customer>, что дает точное соответствие. Для второй перегрузки он выводит T как Customer, поэтому параметр будет IEnumerable<Customer>, что менее точное, чем List<Customer>.

Ответ 3

Не думай так. Не думайте, что возможно, что в этом случае IEnumerable<T> всегда будет вызываться перегрузка, поскольку она имеет менее точное совпадение в отношении типа T. Если вы не укажете конкретный IEnumerable<T>, наилучшее совпадение всегда будет первым методом, в данном случае.

Ответ 4

ShouldHave() имеет двойное значение. В первом случае ShouldHave() имеет возврат об объекте, предоставленном объектом-параметром. Во втором случае возврат относится к элементам в перечислении, а не к самому перечислению.

В случае, если я создаю свою собственную коллекцию, и я хочу протестировать эту коллекцию (а не элементы), я, конечно, хочу, чтобы был вызван ShouldHave (этот T-объект), а не ShouldHave (этот объект IEnumerable).

Возможно, вам стоит пересмотреть свой дизайн. Вторая функция ShouldHave() выполняет две функции, поэтому ее следует разделить на метод, который извлекает элементы коллекции и вызов первого ShouldHave(), который у вас уже есть.