Неправильный метод расширения - PullRequest
0 голосов
/ 31 января 2011

У меня есть следующие методы расширения:

public static void Replace<T>(this IList list, T newItem)

public static void Replace<T>(this IList<T> list, IEnumerable newItems)

public static void Replace<T>( this IList<T> list, IEnumerable<T> newItems )

У меня есть оператор Linq, который создает IList<IWell>, называемый скважиной.(Я подтверждаю во время выполнения, что число скважин равно IEnumerable<IWell>.)

Однако оператор

SelectedValues.Replace( wells );

всегда затрагивает первый метод расширения, а не второй или третий.(Я подтверждаю во время выполнения, что SelectedValues ​​IList<IWell>.)

Очевидно, что я делаю неправильно?

Ответы [ 3 ]

1 голос
/ 31 января 2011

Что такое объявленный тип SelectedValues и wells?Методы расширения связаны во время компиляции, а не во время выполнения, поэтому важны типы времени компиляции.

Редактировать: Поскольку вы сказали, что SelectedValues объявлен как тип IList, единственный возможный кандидатдля использования в качестве метода расширения для SelectedValues из трех указанных вами значений будет

public static void Replace<T>(this IList list, T newItem)

. Затем компилятор понимает, что он может рассматривать wells как T с T как объявленным типомwells и затем может вызвать метод

public static void Replace<T>(this IList list, T newItem)

, где SelectedValues заполняет для параметра list и wells, заполняет для параметра newItem, и объявленный тип wells заполняет параметр типа T.Вот почему этот метод расширения вызывается.

Опять же, методы расширения связаны во время компиляции.Если вы хотите вызвать другой метод, вам нужно использовать другой объявленный тип для SelectedValues.

Таким образом, это не случай компилятора "Соответствующий неправильный метод расширения", это случайкомпилятор, соответствующий единственно возможному методу расширения.Такое поведение является особенностью;это особенность, а не ошибка.

0 голосов
/ 31 января 2011

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

Также было бы неплохо узнать что это за тип SelectedValues - тот факт, что он реализует IList<IWell>, не мешает ему также реализовать IList.

0 голосов
/ 31 января 2011

Я не могу вспомнить правила для предпочтения перегрузки, но как решение, определение (лишнее) приведение обычно исправляет это:

SelectedValues.Replace((IEnumerable<IWell>)wells);
...