Пожалуйста, проверьте следующие сегменты кодов:
public interface ICountable { }
public class Counter<T>
where T : ICountable
{
public int Count(IEnumerable<T> items)
{
return 0;
}
public int Count(T Item)
{
return 0;
}
}
public class Counter
{
public int Count<T>(IEnumerable<T> items)
where T : ICountable
{
return 0;
}
public int Count<T>(T Item)
where T : ICountable
{
return 0;
}
}
Две версии Counter отличаются только спецификацией универсального параметра. Один из них определяется как параметр универсального типа, другой — как универсальный аргумент. Оба ограничивают аргументы метода для реализации интерфейса ICountable. Я буду называть их конкретными и неконкретными соответственно.
Теперь я определяю класс, реализующий интерфейс ICountable, и набор экземпляров:
public class CItem : ICountable { }
var countables = new List<CItem>();
Затем я хотел бы использовать оба класса Counter в коллекции.
var specific = new Counter<CItem>();
var nonspecific = new Counter();
specific.Count(countables);
nonspecific.Count(countables);
Конкретный счетчик распознает, что коллекция countables должна попадать в сигнатуру int Count(IEnumerable), а неконкретная версия — нет. Я получаю сообщение об ошибке:
Тип «
System.Collections.Generic.List<CItem>
» нельзя использовать в качестве параметра типа «T
» в универсальном типе или методе «Counter.Count<T>(T)
». Нет неявного преобразования ссылок изList<CItem>
' вICountable
.
Кажется, что неспецифическая версия использует неправильную подпись для коллекции.
Почему они ведут себя по-разному? Как можно указать неспецифическую версию, чтобы она вела себя так же, как и другая?
Примечание. Я знаю, что этот пример не соответствует действительности. Однако я столкнулся с этой проблемой в довольно сложном сценарии с методами расширения. Я использую эти классы для простоты
заранее спасибо
nonspecific.Count<CItem>(countables);
, это тоже будет работать - person farid bekran   schedule 16.12.2015countables
сIEnumerable<CItem> countables = new List<CItem>();
, будет выбрана правильная перегрузка. - person SWeko   schedule 16.12.2015