Выбор методов перегрузки расширения - PullRequest
12 голосов
/ 25 марта 2012

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

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. Можно ли в обоих случаях выбрать вторую перегрузку?

Ответы [ 4 ]

7 голосов
/ 25 марта 2012

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

5 голосов
/ 25 марта 2012

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

1 голос
/ 05 сентября 2012

В Fluent Assertion 2.0 мне наконец-то удалось решить вышеуказанные проблемы достойным образом. Прочитайте все об этом здесь: http://www.dennisdoomen.net/2012/09/asserting-object-graph-equivalence.html

1 голос
/ 25 марта 2012

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

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

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

...