Реализовать EntitySet как IList

Я играю с LinqToSql и пытаюсь реализовать шаблон Repository для одного из моих классов. Проблема возникает, когда я пытаюсь сопоставить свойство, которое является EntitySet к IList, я получаю ошибку

"TheCore.Models.User" не реализует элемент интерфейса "TheCore.Models.IUserRepository.Vehicles". "TheCore.Models.User.Vehicles" не может реализовать "TheCore.Models.IUserRepository.Vehicles", поскольку у него нет соответствующего возвращаемого типа "System.Collections.Generic.IList".

Кажется, что EntitySet реализует IList, так почему я не могу сопоставить свойство IList со свойством EntitySet?

EntitySet:

        [global::System.Data.Linq.Mapping.AssociationAttribute(Name="Users_Vehicles", Storage="_Vehicles", ThisKey="Id", OtherKey="FkOwnerId")]
    public EntitySet<Vehicle> Vehicles
    {
        get
        {
            return this._Vehicles;
        }
        set
        {
            this._Vehicles.Assign(value);
        }
    }

Интерфейс репозитория:

        IList<Vehicle> Vehicles { get; set; }

2 ответа

Решение

Возвращаемый тип реализации интерфейса должен соответствовать возвращаемому типу, объявленному в интерфейсе. Это называется ковариацией возвращаемого типа, и она не поддерживается C#.

Таким образом, приведенный ниже код не работает, хотя List инвентарь IList

public interface IFoo
{
    IList<string> Foos {get; set;}
}

public class Foo : IFoo
{
    public List<string> Foos {get; set;}
}

Посмотрите на этот вопрос: "Интерфейс не реализован" при возврате производного типа

Возможно, я не понимаю ваш вопрос, но, похоже, у вас есть интерфейс с методом IList<Vehicle> Vehicles { get; set; } и пытается выполнить контракт, предоставляя реализацию public EntitySet<Vehicle> Vehicles, Это недопустимо - реализация должна предоставлять тот же тип возврата, что и интерфейс (IList<Vehicle> в этом случае). Если вы можете, измените реализацию репозитория, чтобы обернуть EntitySet, а затем сопоставьте метод с требуемым интерфейсом:

public class Vehicle
{
}
public interface IRepository
{
    IList<Vehicle> Vehicles { get; set; }
}

public class Repository : IRepository
{
    private EntitySet<Vehicle> _Vehicles;
    public IList<Vehicle> Vehicles
    {
        get
        {
            return this._Vehicles;
        }
        set
        {
            this._Vehicles.Assign(value);
        }
    }
}
Другие вопросы по тегам