Я работаю с библиотекой классов под названием DDay ICal. Это оболочка C# для системы iCalendar, реализованная в календарях Outlook и во многих других системах. Мой вопрос связан с некоторой работой, которую я выполнял с этой системой.
Здесь речь идет о 3 объектах
- IRecurrencePattern — Интерфейс
- RecurrencePattern — реализация интерфейса IRecurrencePattern
- DbRecurPatt — пользовательский класс с оператором неявного типа.
IRecurrencePattern: показан не весь код
public interface IRecurrencePattern
{
string Data { get; set; }
}
RecurrencePattern: показан не весь код
public class RecurrencePattern : IRecurrencePattern
{
public string Data { get; set; }
}
DbRecurPatt: показан не весь код
public class DbRecurPatt
{
public string Name { get; set; }
public string Description { get; set; }
public static implicit operator RecurrencePattern(DbRecurPatt obj)
{
return new RecurrencePattern() { Data = $"{Name} - {Description}" };
}
}
Запутанная часть: в нашей системе DDay.ICal они используют IList
s для хранения коллекции шаблонов повторения для каждого события в календаре, пользовательский класс используется для извлечения информации из базы данных, а затем он передается в шаблон повторения через оператор неявного преобразования типа.
Но в коде я заметил, что он продолжает падать при преобразовании в List<IRecurrencePattern>
из List<DbRecurPatt>
. Я понял, что мне нужно преобразовать в RecurrencePattern
, а затем преобразовать в IRecurrencePattern
(поскольку есть другие классы, которые реализуют IRecurrencePattern
по-другому, которые также включены в коллекцию
var unsorted = new List<DbRecurPatt>{ new DbRecurPatt(), new DbRecurPatt() };
var sorted = unsorted.Select(t => (IRecurrencePattern)t);
Приведенный выше код не работает, выдает ошибку IRecurrencePattern
.
var sorted = unsorted.Select(t => (IRecurrencePattern)(RecurrencePattern)t);
Это действительно работает, поэтому у меня есть вопрос; Почему первый не работает? (И есть ли способ улучшить этот метод?)
Я полагаю, что это может быть связано с тем, что неявный оператор находится в объекте RecurrencePattern
, а не в интерфейсе, это правильно? (Я новичок в интерфейсах и неявных операторах)
List<DbRecurPatt>
— это реальный объект. Вы не можете привести его кList<IRecurrencePattern>
, потому что кто-то может попытаться вставить в него не-DbRecurPatt
. - person Damien_The_Unbeliever   schedule 26.08.2015RecurrencePattern
кIRecurrencePattern
будет относиться к одному и тому же объекту, но приведение отDbRecurPatt
кRecurrencePattern
создает совершенно новый объект. Итак, вам нужно сказать ему создать новый объект, прежде чем обращаться к нему как к интерфейсу. - person juharr   schedule 26.08.2015