Я играю с LinqToSql и пытаюсь реализовать шаблон репозитория для одного из моих классов. Проблема возникает, когда я пытаюсь сопоставить свойство 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; }
1
ivlad 10 Май 2014 в 17:53

2 ответа

Лучший ответ

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

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

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

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

Взгляните на этот вопрос: «Интерфейс не реализован» при возврате производного типа

1
Community 23 Май 2017 в 10:33

Возможно, я не понимаю ваш вопрос, но похоже, что у вас есть интерфейс с методом 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);
        }
    }
}
1
StuartLC 11 Май 2014 в 09:48