Правила перегрузки не учитывают ограничения на методы, которые он рассматривает - он определяет, какая перегрузка является наилучшей, и , а затем проверяет, что ограничения соответствуют.
Компилятор точноследуя правилам спецификации C #.
Связанные записи в блоге:
РЕДАКТИРОВАТЬ: Обратите внимание, что использование «enumerableOrQueryable» всегда собирается преобразовать ваше лямбда-выражение в делегат, а не дерево выражений.Так что, если вы хотите, чтобы она выполняла логику по-другому для базы данных, вам все равно понадобилось бы изменение.
РЕДАКТИРОВАТЬ: Ваша идея также не будет работать, потому что вы не получитетот же тип результата в любом случае - если вы вызываете Where
на List<string>
, возвращаемое значение не a List<string>
.
То, что вы можете Сделайте это, если вы можете ввести новый интерфейс, который будет реализован как ClassA, так и ClassB:
public static IQueryable<T> IsActive<T>(this IQueryable<T> source, bool isActive)
where T : ICanBeActive
{
// Lambda converted to an expression tree
return source.Where(x => x.IsActive == isActive);
}
public static IEnumerable<T> IsActive<T>(this IEnumerable<T> source,
bool isActive) where T : ICanBeActive
{
// Lambda converted to a delegate
return source.Where(x => x.IsActive == isActive);
}