#c# #.net #inheritance #extension-methods
Вопрос:
Я работаю над небольшим практическим проектом для себя и пытаюсь вызвать этот метод расширения в своих тестах
var days = account.Transactions.PassDays(10, Today);
что приводит меня к этой ошибке
CS1929 'List<Transaction>' does not contain a definition for 'PassDays' and the best extension method overload 'PassTime.PassDays(List<Event>, int, DateTime)' requires a receiver of type 'List<Event>'
Оператор using выделен, метод расширения объявлен как
public static IEnumerable<Day> PassDays(this List<Event> events, int daysToPass, DateTime startTime)
Список, в котором я пытаюсь его использовать, относится к классу, производному от класса событий. Все, что я читал, говорит о том, что это должно сработать.
public record Transaction : Event
public record Event : IEvent
Комментарии:
1.
List<Transaction>
не являетсяList<Event>
(и не является производным от) , так чего же вы ожидали? Если вы хотите использовать ковариацию, вам нужно использовать такой интерфейс, какIEnumerable
2. Это потому ,
Transaction
что, наследуяEvent
,List<Transaction>
не наследуетList<Event>
? Каким было бы ваше предложение, не делая его конкретным расширениемList<Transaction>
, потому что я планирую использовать тот же метод для других наследуемых классовEvent
. Только что видел вашу правку, я попробую это сделать.
Ответ №1:
с помощью
public static IEnumerable<Day> PassDays(this IEnumerable<IEvent> events, int daysToPass, DateTime startTime)
исправил это. ( IEvent
в этом не было необходимости, но я внес изменения в ожидании того, что это будет более полезно) может быть, кто-то еще сможет объяснить, почему это сработало.
Комментарии:
1. почему это сработало — это долго читать, но соответствующий бит находится в конце; docs.microsoft.com/en-us/dotnet/standard/generics/…