Метод расширения недоступен из списка производного типа

#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/…